OpenCV学习笔记(十四):重映射:remap( )

图像的坐标映射是通过原图像与目标图像之间建立一种映射关系,这种映射关系有两种,一种是计算原图像任意像素在映射后图像的坐标位置,另一种是计算变换后图像任意像素反映射在原图像的坐标位置。
opencv中提供重映射等操作,其中重映射就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。为了完成映射过程,需要获得一些插值为非整数像素的坐标。对于原图像和目标图像,满足下式:
G(x,y)=f(h(x,y))
G()是目标图像,f()是源图像,而h(x,y)是作用于(x,y)的映射方法函数。

1、remap()函数

函数remap使用指定的映射转换源图像,其公式为:

Void remap(InputArray src,           // 源图像
OutputArray dst,                    // 目标图像
InputArray map1,                    // 第一个映射 ,x坐标
InputArray map2,                    // 第二个映射 ,y坐标
int interpolation,                  // 表示插值方法
int borderMode=BORDER_CONSTANT,        // 表示边界插值类型
const Scalar&borderValue=Scalar()) // 表示插值数值map1和map2:代表目标图中的(x,y)点在原图像的x坐标和y坐标;
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;#define WINDOW_NAME "重映射"        //为窗口标题定义的宏
Mat g_srcImage, g_dstImage;
Mat g_map_x, g_map_y;int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);printf( "\n\t按键操作说明: \n\n""\t\t键盘按键【ESC】- 退出程序\n""\t\t键盘按键【1】-  第一种映射方式:缩放\n""\t\t键盘按键【2】- 第二种映射方式:上下翻转\n""\t\t键盘按键【3】- 第三种映射方式:左右翻转\n""\t\t键盘按键【4】- 第四种映射方式:上下左右180度翻转\n"   );g_srcImage = imread( "F:/C++/2. OPENCV 3.1.0/TEST/2.jpg", 1 );if(!g_srcImage.data ) { printf("读取图片错误,请确定目录下是否有imread函数指定的图片存在~! \n"); return false; }imshow("原始图",g_srcImage);// 1、创建和原始图一样的效果图,x重映射图,y重映射图// map1和map2:代表目标图中的(x,y)点在原图像的x坐标和y坐标;g_dstImage.create( g_srcImage.size(), g_srcImage.type() );g_map_x.create( g_srcImage.size(), CV_32FC1 );g_map_y.create( g_srcImage.size(), CV_32FC1 );// 2、创建窗口并显示namedWindow( WINDOW_NAME, CV_WINDOW_AUTOSIZE );imshow(WINDOW_NAME,g_srcImage);// 3、轮询按键,更新map_x和map_y的值,进行重映射操作并显示效果图while( 1 ){//获取键盘按键int key = waitKey(0);//判断ESC是否按下,若按下便退出if( (key & 255) == 27 ){cout << "程序退出...........\n";break;}//根据按下的键盘按键来更新 map_x & map_y的值. 然后调用remap( )进行重映射update_map(key);remap( g_srcImage, g_dstImage, g_map_x, g_map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0,0, 0) );//显示效果图imshow( WINDOW_NAME, g_dstImage );}waitKey(0);return a.exec();
}
int update_map( int key )
{//双层循环,遍历每一个像素点for( int j = 0; j < g_srcImage.rows;j++){for( int i = 0; i < g_srcImage.cols;i++){switch(key){case '1': // 键盘【1】键按下,进行第一种重映射操作if( i > g_srcImage.cols*0.25 && i < g_srcImage.cols*0.75 && j > g_srcImage.rows*0.25 && j < g_srcImage.rows*0.75){g_map_x.at<float>(j,i) = static_cast<float>(2*( i - g_srcImage.cols*0.25 ) + 0.5); //行缩小g_map_y.at<float>(j,i) = static_cast<float>(2*( j - g_srcImage.rows*0.25 ) + 0.5); //列缩小    }else{g_map_x.at<float>(j,i) = 0;g_map_y.at<float>(j,i) = 0;}break;case '2':// 键盘【2】键按下,进行第二种重映射操作g_map_x.at<float>(j,i) = static_cast<float>(i);                        // 行不变(X不变)g_map_y.at<float>(j,i) = static_cast<float>(g_srcImage.rows - j);      // 列翻转(Y翻转不变)break;case '3':// 键盘【3】键按下,进行第三种重映射操作g_map_x.at<float>(j,i) = static_cast<float>(g_srcImage.cols - i);       // 行翻转g_map_y.at<float>(j,i) = static_cast<float>(j);                         // 列不变break;case '4':// 键盘【4】键按下,进行第四种重映射操作g_map_x.at<float>(j,i) = static_cast<float>(g_srcImage.cols - i);       // 行翻转g_map_y.at<float>(j,i) = static_cast<float>(g_srcImage.rows - j);      // 列翻转break;}}}return 1;
}


1、缩小(XY 缩放)

2、Y方向翻转(X不变,Y翻转)

3、X方向翻转(X翻转,Y不变)

4、X,Y 方向均翻转(XY均翻转)

OpenCV学习笔记(十四):重映射:remap( )相关推荐

  1. OpenCV学习笔记(四十六)——FAST特征点检测features2D OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui OpenCV学习笔记(四十八)——PCA算

    OpenCV学习笔记(四十六)--FAST特征点检测features2D 特征点检测和匹配是计算机视觉中一个很有用的技术.在物体检测,视觉跟踪,三维常年关键等领域都有很广泛的应用.这一次先介绍特征点检 ...

  2. OpenCV学习笔记(四十一)——再看基础数据结构core OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年 OpenCV学习笔记(四十三)——存取像素值操作汇总co

    OpenCV学习笔记(四十一)--再看基础数据结构core 记得我在OpenCV学习笔记(四)--新版本的数据结构core里面讲过新版本的数据结构了,可是我再看这部分的时候,我发现我当时实在是看得太马 ...

  3. OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年

    首先还是要感谢箫鸣朋友在我<OpenCV学习笔记(四十)--再谈OpenCV数据结构Mat详解>的留言,告诉我M.at<float>(3, 3)在Debug模式下运行缓慢,推荐 ...

  4. OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack()

    OpenCV学习(二十四 ):角点检测(Corner Detection):cornerHarris(),goodFeatureToTrack() 参考博客: Harris角点检测原理详解 Harri ...

  5. Polyworks脚本开发学习笔记(十四)-WORKSPACE信息读取及管理

    Polyworks脚本开发学习笔记(十四)-WORKSPACE信息读取及管理 Polyworks的工作任务存储分为工作区和项目两级,通过WORKSPACE命令获取工作任务信息,实现更好的任务管理. 下 ...

  6. OpenCV学习笔记(十二)——图像分割与提取

    在图像处理的过程中,经常需要从图像中将前景对象作为目标图像分割或者提取出来.例如,在视频监控中,观测到的是固定背景下的视频内容,而我们对背景本身并无兴趣,感兴趣的是背景中出现的车辆.行人或者其他对象. ...

  7. OpenCV学习笔记(四):XML,YAML(.txt,.doc)文件读写操作

    OpenCV学习笔记(四):XML,YAML(.txt,.doc)文件读写操作 一.Write_XML_and_YAML_File(写入XML) #include <opencv2/opencv ...

  8. 吴恩达《机器学习》学习笔记十四——应用机器学习的建议实现一个机器学习模型的改进

    吴恩达<机器学习>学习笔记十四--应用机器学习的建议实现一个机器学习模型的改进 一.任务介绍 二.代码实现 1.准备数据 2.代价函数 3.梯度计算 4.带有正则化的代价函数和梯度计算 5 ...

  9. 检测单击鼠标左键并拖动的消息_计算机视觉OpenCV学习笔记(四):关于鼠标的相关事件函数...

    (7)把鼠标当画笔 本篇目标: 学会使用OpenCV中的鼠标处理的相关事件,事件回调函数怎么去定义,参数有哪些,以及如何注册鼠标监听事件. 7.1 .1 回调函数的定义: 1 def name(eve ...

  10. OpenCV学习12_霍夫变换与重映射

    一.霍夫变换 在图像处理和计算机视觉领域中,如何从当前的图像中提取所需要的特征信息是图像识别的关键所在.在许多应用场合中需要快速准确地检测出直线或者圆.其中一种非常有效的解决问题的方法是霍夫(Houg ...

最新文章

  1. php smtp 超时,SMTP错误:无法连接到服务器:连接超时(110)与PHPMailer和Outlook SMTP
  2. halcon知识:【2】二维码原理
  3. windows下安装python+eclipse
  4. ubuntu vi 按方向键出现很多字母是怎么回事?(没安装vim)
  5. 资深数据大牛《教你如何从零开始做大数据底层架构》!(转)
  6. BI@Report烂笔头
  7. 规避软件架构风险之反模式
  8. 京东宙斯平台使用方法(accesstoken,appkey,appsecret参数和SDK的获取)
  9. Linux中配置网桥
  10. 试图删除 xx 和yy之间的关系。但是,关系的其中一个外键 (xx_yy.xxID) 无法设置为 null。...
  11. 拓端tecdat:已迁离北京外来人口的数据画像
  12. Hadoop 入门教程(超详细)
  13. xdb 服务_如何禁用Oracle的XDB及修改XDB服务端口
  14. 常用的学习软件,网站
  15. java实现会员充值功能
  16. mysql分组之后再求和
  17. GX、LS型螺旋输送机结构新颖 噪声低
  18. 超详细的张飞硬件90天读书笔记02
  19. 深入理解 DiscoveryClient
  20. 皮影机器人ppt_第27届计算机表演赛—智能皮影机器人

热门文章

  1. 域用户频繁被锁定怎么解决_Oracle11g用户频繁锁定并且解锁后不允许登录
  2. 互联网企业安全之端口监控
  3. 进阶阿里架构师:算法、编程语言、数据库、架构设计!书单推荐!
  4. Android官方开发文档Training系列课程中文版:创建自定义View之View的优化
  5. formSelects-v4.js 基于Layui的多选解决方案
  6. 开发相关的一些周边小问题记录
  7. ubuntu-18.04 修改用户名密码
  8. 程序猿的日常——JVM内存模型与垃圾回收
  9. 数据结构-使用两个栈实现一个队列
  10. 匹夫细说C#:庖丁解牛迭代器,那些藏在幕后的秘密