本例中使用OpenCV的remap()函数实现简单的图像重映射(remapping)。


什么是重映射?

将一幅图像中的像素,改变位置得到一副新的图像,如图像缩放、翻转等。

因为源图像和新图像之间不一定是一一对应。这个操作的过程中,可能需要对非整数像素位置进行一些插值。

可以用下面公式来表示映射后像素位置

其中,

表示映射后的图像,
表示源图像,
表示映射函数。

一个简单的例子,如果源图像为I,那么进行如下映射,会得到什么样的图像:

很明显得到的是左右翻转后的新图像,如下图所示。

原图
左右翻转后

代码

 // @tutorials imgproc module 18// @文件 Remap_Demo.cpp// @主题 图像重映射// @修改 CVer// @日期 2020年8月26日#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>using namespace cv;
//h(x, y) = (I.cols - x, y)其中x,y分别对应map_x和map_y
//产生四种映射,按照ind的数值进行选择,对map_x和map_y赋值
void update_map( int &ind, Mat &map_x, Mat &map_y );int main(int argc, const char** argv)
{CommandLineParser parser(argc, argv, "{@image |chicky_512.png|input image name}");std::string filename = parser.get<std::string>(0);//读入图像Mat src = imread( samples::findFile( filename ), IMREAD_COLOR );if (src.empty()){std::cout << "Cannot read image: " << filename << std::endl;return -1;}//创建dst, map_x and map_y,大小与src相同:Mat dst(src.size(), src.type());Mat map_x(src.size(), CV_32FC1);Mat map_y(src.size(), CV_32FC1);//创建显示窗口,大小自动const char* remap_window = "Remap demo";namedWindow( remap_window, WINDOW_AUTOSIZE );///循环,根据ind选择remap的类型int ind = 0;for(;;){//更新map_x & map_y,并变换update_map(ind, map_x, map_y);remap( src, dst, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0) );//显示结果imshow( remap_window, dst );imshow("x", map_x);imshow("y", map_y);//暂停1秒.按ESC退出char c = (char)waitKey( 1000 );if( c == 27 ){break;}}return 0;
}
//根据前面的变换公式,需要计算所有位置坐标x,y变换后的值,即
//新的位置mat_x,mat_y,这里是四种变换示例
void update_map( int &ind, Mat &map_x, Mat &map_y )
{for( int i = 0; i < map_x.rows; i++ ){for( int j = 0; j < map_x.cols; j++ ){switch( ind ){case 0:if( j > map_x.cols*0.25 && j < map_x.cols*0.75 && i > map_x.rows*0.25 && i < map_x.rows*0.75 ){map_x.at<float>(i, j) = 2*( j - map_x.cols*0.25f ) + 0.5f;map_y.at<float>(i, j) = 2*( i - map_x.rows*0.25f ) + 0.5f;}else{map_x.at<float>(i, j) = 0;map_y.at<float>(i, j) = 0;}break;case 1:map_x.at<float>(i, j) = (float)j;map_y.at<float>(i, j) = (float)(map_x.rows - i);break;case 2:map_x.at<float>(i, j) = (float)(map_x.cols - j);map_y.at<float>(i, j) = (float)i;break;case 3:map_x.at<float>(i, j) = (float)(map_x.cols - j);map_y.at<float>(i, j) = (float)(map_x.rows - i);break;default:break;} // end of switch}}ind = (ind+1) % 4;
}

结果

左右翻转
上下左右翻转
上下翻转
缩放

opencv mat赋值_【3】OpenCV图像处理模块(18)重映射相关推荐

  1. opencv mat初始化_【OpenCV入门之十二】看起来一样的图像竟然存在这么大的差别!...

    小白导读 学习计算机视觉最重要的能力应该就是编程了,为了帮助小伙伴尽快入门计算机视觉,小白准备了[OpenCV入门]系列.新的一年文章的内容进行了很大的完善,主要是借鉴了更多大神的文章,希望让小伙伴更 ...

  2. OpenCV精进之路(七):图像变换——重映射与仿射变换

    重映射 重映射就是把一幅图像中某个位置的像素放置到另一个图片中指定位置的过程. 用一个数学公式来表示就是: 其中的 f 就是映射方式,也就说,像素点在另一个图像中的位置是由 f 来计算的. 在Open ...

  3. python opencv 图像切割_【OpenCV+Python】图像的基本操作与算术运算

    图像的基本操作 在上个教程中,我们介绍了使用鼠标画笔的功能.本次教程,我们将要谈及OpenCV图像处理的基本操作. 本次教程的所有操作基本上都和Numpy相关,而不是与OpenCV相关.要使用Open ...

  4. opencv 检测几何图形_使用OpenCV + ConvNets检测几何形状

    opencv 检测几何图形 A simple yet powerful pipeline for detecting shapes in scanned documents 一个简单而强大的管道,用于 ...

  5. opencv物品定位_使用OpenCV获取零件位置的学习笔记

    最近公司接到一个案子,使用移动机械臂抓取圆盘上下料,目前我们的移动机器人定位精度在两厘米左右,因此需要视觉辅助定位来提高夹取的精度. 这个项目本身不是我做,出于对是视觉的兴趣,学习了一下如何使用Ope ...

  6. opencv mat赋值_opencv-python 关于位操作

    通过opencv 作出这种效果 思路: import cv2 ''' 网址: https://www.pianshen.com/article/7034104097/ 目的;把logo添上到fishe ...

  7. opencv mat release thrown_【OpenCV+Python】图像与视频处理入门

    图像处理入门 之前我们已经讲过了OpenCV在各个平台上安装的方法了,从今天开始,正式进入实战部分.首先我们需要做的就是如何读取图像并显示出来,这是图像处理的最基本的部分. 首先我们来了解几个函数. ...

  8. opencv java库_【OpenCV】java资源

    前些日子做了个数字图像识别的小项目,用到了 java 的 OpenCV 库,今天把搜集到的资源整理分享出来. 1.教程 易百教程 文档 OpenCV中文网站 2.方法调用 图像处理之常见二值化方法汇总 ...

  9. opencv 光线影响_在OpenCV中使用色彩校正

    编者按:今年OpenCV收到了很多来自中国的贡献,比如DNN的ARM后端Tengine.基于深度学习的文本检测识别.对RISC-V的支持等新功能.在即将发布的4.5.1版本,华为开源能力中心的工程师又 ...

最新文章

  1. fedora常见问题和解决方案
  2. 执行python文件报错SyntaxError: Non-ASCII character '\xe8' in file, but no encoding declared
  3. 无边框窗体移动的方法
  4. Android软件开发之盘点自定义View界面大合集(二)
  5. 容器编排技术 -- Pod 安全策略
  6. 揭开中国IDC产业神秘面纱
  7. SQL数据库从高版本到低版本的迁移,同时解决sql脚本文件太大无法打开的尴尬问题
  8. 瀑布流布局的实现方式
  9. 缓存应用(一)Ehcache使用介绍
  10. (JZ1619)2018.07.08【2018提高组】模拟C组 0 .音乐节拍
  11. JS实现星星评分系统
  12. 我如何启动任何.NET Core Web API项目
  13. 华硕P8H61-M+i3-3220 +GTX650
  14. python split()函数
  15. 1N4007、M7、A7整流二极管,有什么区别?
  16. 《Visual C++ 2010入门教程》
  17. 延时加载全局的js和css
  18. 计算机制图国家规范,GB/T 30263-2013
  19. ZigBee技术简介 -- ZigBee技术优势
  20. 【英语:基础进阶_正式场景表达】F5.时事热点必备口语

热门文章

  1. 【精彩回顾】软件DevOps云化发展的趋势
  2. 工业机器人实训耗材_工业机器人实训室
  3. 红橙Darren视频笔记 启动不在清单文件注册的activity 安卓8有效
  4. java web inf_Java Web中如何访问WEB-INF下的XML文件
  5. No dashboards are active for the current data set. 解决tensorboard无法启动和显示问题
  6. Sublime Merge Stage时提示系统找不到指定的文件
  7. 第九章:在Spark集群上掌握比较重要的图操作之Structural Operators
  8. day32 java的多线程(4)synchronized
  9. Java运算符(Operator)之 算数运算符(ArithmeticOperator)
  10. python 之禅_Python 之禅