当前位置: 首页 > java >正文

OpenCV 图形API(77)图像与通道拼接函数-----对图像进行几何变换函数remap()

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

对图像应用一个通用的几何变换。
函数 remap 使用指定的映射对源图像进行变换:
dst ( x , y ) = src ( m a p x ( x , y ) , m a p y ( x , y ) ) \texttt{dst} (x,y) = \texttt{src} (map_x(x,y),map_y(x,y)) dst(x,y)=src(mapx(x,y),mapy(x,y))
其中具有非整数坐标的像素值是使用一种插值方法计算得出的。
mapx 和 mapy 可以分别作为浮点型映射表存储在 map1 和 map2 中,
也可以将 (x, y) 坐标交错地存储在 map1 中,
或者使用 convertMaps 函数创建的定点格式的映射。

你可能希望将浮点型映射转换为定点格式的原因是,这样可以显著提升(大约 2 倍)重映射操作的速度。

在定点格式中,map1 包含了 (cvFloor(x), cvFloor(y)) 的配对值,而 map2 包含了一个用于插值系数表的索引。输出图像的大小和深度必须与输入图像相同。

注意
函数的文本 ID 是 “org.opencv.core.transform.remap”。
受当前实现限制,输入图像和输出图像的尺寸不得超过 32767x32767。

函数原型

GMat cv::gapi::remap 
(const GMat &  	src,const Mat &  	map1,const Mat &  	map2,int  	interpolation,int  	borderMode = BORDER_CONSTANT,const Scalar &  	borderValue = Scalar() 
) 	

参数

  • 参数 src:源图像。
  • 参数 map1:第一个映射表,可以是包含 (x, y) 点或仅包含 x 值的数组,类型可以是 CV_16SC2、CV_32FC1 或 CV_32FC2。
  • 参数 map2:第二个映射表,包含 y 值,类型可以是 CV_16UC1、CV_32FC1,或者为空(当 map1 已经包含 (x, y) 点时)。
  • 参数 interpolation:插值方法(参见 cv::InterpolationFlags)。该函数不支持 INTER_AREA 和 INTER_LINEAR_EXACT 方法。
  • 参数 borderMode:像素外推方法(参见 cv::BorderTypes)。当 borderMode=BORDER_TRANSPARENT 时,表示目标图像中对应于源图像“越界”位置的像素不会被修改。

代码示例

include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>  // 包含G-API的核心功能
#include <opencv2/opencv.hpp>using namespace cv;
using namespace cv::gapi;// 示例函数:为简单起见,这里只是创建了两个简单的映射表
void createMaps( Size sz, Mat& map_x, Mat& map_y )
{map_x.create( sz, CV_32FC1 );map_y.create( sz, CV_32FC1 );for ( int j = 0; j < sz.height; ++j ){for ( int i = 0; i < sz.width; ++i ){map_x.at< float >( j, i ) = static_cast< float >( i-10 );map_y.at< float >( j, i ) = static_cast< float >( j-5 );}}
}int main()
{// 读取源图像Mat src = imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png" );if ( src.empty() ){std::cerr << "无法读取图像,请检查路径!" << std::endl;return -1;}// 创建映射表,这里仅作演示目的,实际应用中应根据需求生成Mat map_x, map_y;createMaps( src.size(), map_x, map_y );  // 这里假设有一个函数createMaps用于创建映射表// 定义插值方法和边界模式int interpolation = INTER_LINEAR;  // 使用双线性插值int borderMode    = BORDER_CONSTANT;Scalar borderValue( 0, 0, 0 );  // 黑色填充边界// 使用G-API进行remap操作GMat in, out;GComputation remap_comp( GIn( in ), GOut( gapi::remap( in, map_x, map_y, interpolation, borderMode, borderValue ) ) );// 对图像执行计算Mat dst;remap_comp.apply( gin( src ), gout( dst ) );// 显示结果imshow( "原始图像", src );imshow( "重映射后的图像", dst );waitKey();return 0;
}

运行结果

在这里插入图片描述

http://www.xdnf.cn/news/4269.html

相关文章:

  • 面试常问系列(一)-神经网络参数初始化-之-softmax
  • java springboot解析出一个图片的多个二维码
  • 软考-软件设计师中级备考 13、刷题 数据结构
  • k8s node soft lockup (内核软死锁) 优化方案
  • python3使用:macOS上通过Homebrew安装pip库
  • linux 如何防止内存碎片化?
  • C#中不能通过new关键字创建实例的情况
  • conda虚拟环境相关操作
  • LeetCode 热题 100 39. 组合总和
  • Jetpack Compose 自定义 Slider 完全指南
  • QT键盘触发按钮
  • laravel 12 监听syslog消息,并将消息格式化后存入mongodb
  • 深度解析:2D 写实交互数字人 —— 开启智能交互新时代
  • API 开发实战:基于京东开放平台的实时商品数据采集接口实现
  • 【25软考网工】第五章(6)TCP和UDP协议、流量控制和拥塞控制、重点协议与端口
  • 项目中为什么选择RabbitMQ
  • Vision-Language Models (VLMs) 视觉语言模型的技术背景、应用场景和商业前景(Grok3 DeepSearch模式回答)
  • 隔离端口配置
  • 消除AttributeError: module ‘ttsfrd‘ has no attribute ‘TtsFrontendEngine‘报错输出的记录
  • 2015-2018年 重要城市交通拥堵指数-社科数据
  • Ragflow服务器上部署教程
  • 前端、XSS(跨站脚本攻击,Cross-Site Scripting)
  • 深入理解 Oracle 数据块:行迁移与行链接的性能影响
  • 互联网大厂Java求职面试:云原生与AI融合下的系统设计挑战-2
  • 网络编程核心技术解析:从Socket基础到实战开发
  • 在Spring Boot 中如何配置MongoDB的副本集 (Replica Set) 或分片集群 (Sharded Cluster)?
  • C++ STL 基础与多线程安全性说明文档
  • 如何开发一个笑话管理小工具
  • 盛最多水的容器
  • conda 安装cudnn