重映射是什么意思?

  • 把一个图像中一个位置的像素放置到另一个图片指定位置的过程.

  • 为了完成映射过程, 有必要获得一些插值为非整数像素坐标,因为源图像与目标图像的像素坐标不是一一对应的.

  • 我们通过重映射来表达每个像素的位置  :

    这里  是目标图像,  是源图像,  是作用于  的映射方法函数.

让我们来思考一个快速的例子. 想象一下我们有一个图像  , 我们想满足下面的条件作重映射:

会发生什么? 图像会按照  轴方向发生翻转.

映射函数 remap. 参数说明:

代码如下:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h> using namespace cv; /// Global variables
Mat src, dst;
Mat map_x, map_y;
char* remap_window = "Remap demo";
int ind = ; /// Function Headers
void update_map(void); /**
* @function main
*/
int main(int argc, char** argv)
{
/// Load the image
src = imread("E:\\VS2015Opencv\\vs2015\\project\\picture\\06.jpg", ); /// Create dst, map_x and map_y with the same size as src:
dst.create(src.size(), src.type());
map_x.create(src.size(), CV_32FC1);
map_y.create(src.size(), CV_32FC1); /// Create window
namedWindow(remap_window, CV_WINDOW_AUTOSIZE); /// Loop
while (true)
{
/// Each 1 sec. Press ESC to exit the program
int c = waitKey(); if ((char)c == )
{
break;
} /// Update map_x & map_y. Then apply remap
update_map();
remap(src, dst, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(, , )); /// Display results
imshow(remap_window, dst);
}
return ;
} void update_map(void)
{
ind = ind % ; for (int j = ; j < src.rows; j++)
{
for (int i = ; i < src.cols; i++)
{
switch (ind)
{
case :
if (i > src.cols*0.25 && i < src.cols*0.75 && j > src.rows*0.25 && j < src.rows*0.75)
{
map_x.at<float>(j, i) = * (i - src.cols*0.25) + 0.5;
map_y.at<float>(j, i) = * (j - src.rows*0.25) + 0.5;
}
else
{
map_x.at<float>(j, i) = ;
map_y.at<float>(j, i) = ;
}
break;
case :
map_x.at<float>(j, i) = i;
map_y.at<float>(j, i) = src.rows - j;
break;
case :
map_x.at<float>(j, i) = src.cols - i;
map_y.at<float>(j, i) = j;
break;
case :
map_x.at<float>(j, i) = src.cols - i;
map_y.at<float>(j, i) = src.rows - j;
break;
} // end of switch
}
}
ind++;
}

主要代码说明:

建立一个间隔1000毫秒的循环,每次循环执行更新映射矩阵参数并对源图像进行重映射处理(使用 mat_x 和 mat_y),然后把更新后的目标图像显示出来:

重映射函数 remap. 参数说明:

  • src: 源图像
  • dst: 目标图像,与 src 相同大小
  • map_x: x方向的映射参数. 它相当于方法  的第一个参数
  • map_y: y方向的映射参数. 注意 map_y 和 map_x 与 src 的大小一致。
  • CV_INTER_LINEAR: 非整数像素坐标插值标志. 这里给出的是默认值(双线性插值).
  • BORDER_CONSTANT: 默认
while (true)
{
/// Each 1 sec. Press ESC to exit the program
int c = waitKey(1000); if ((char)c == 27)
{
break;
} /// Update map_x & map_y. Then apply remap
update_map();
remap(src, dst, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0)); /// Display results
imshow(remap_window, dst);
}
return 0;
}

  我们做了什么哪些映射过程?(在这里 map_x 代表第一个坐标 h(i,j) , map_y 是第二个坐标,映射后的坐标)

void update_map(void)
{
ind = ind % ; for (int j = ; j < src.rows; j++)
{
for (int i = ; i < src.cols; i++)
{
switch (ind)
{
case :
if (i > src.cols*0.25 && i < src.cols*0.75 && j > src.rows*0.25 && j < src.rows*0.75)
{
map_x.at<float>(j, i) = * (i - src.cols*0.25) + 0.5;
map_y.at<float>(j, i) = * (j - src.rows*0.25) + 0.5;
}
else
{
map_x.at<float>(j, i) = ;
map_y.at<float>(j, i) = ;
}
break;
case :
map_x.at<float>(j, i) = i;
map_y.at<float>(j, i) = src.rows - j;
break;
case :
map_x.at<float>(j, i) = src.cols - i;
map_y.at<float>(j, i) = j;
break;
case :
map_x.at<float>(j, i) = src.cols - i;
map_y.at<float>(j, i) = src.rows - j;
break;
} // end of switch
}
}
ind++;

结果如下:

图像宽高缩小一半,并显示在中间:

图像上下颠倒:

图像左右颠倒:

两个方向同时颠倒:

最新文章

  1. 在IHttpHandler中获取session
  2. 利用百度API Store接口进行火车票查询
  3. Android广播
  4. [UWP]涨姿势UWP源码——RSS feed的获取和解析
  5. C# explicit与implicit
  6. SGU Volume 1
  7. C#程序设计六大原则记录
  8. 2014.9.23window对象
  9. TortoiseGit push失败原因小结(转)
  10. 我用Cocos2d-x模拟《Love Live!学院偶像祭》的Live场景(四)
  11. 自定义控件辅助神器ViewDragHelper
  12. 『OGG 03』Win7 配置 Oracle GoldenGate 一次性成功(包括Adapter Java)
  13. dede首页、列表页调用非缩略图
  14. jenkins系列之jenkins job
  15. Vue前端利用qrcode生成二维码
  16. 神州数码HSRP(热备份路由协议)配置
  17. Oracle中文排序问题
  18. KMP 模式串匹配 失去匹配的瞬间你还有什么
  19. Node入门教程(11)第九章:Node 的网络模块
  20. 什么样的路由器有类似改hosts的功能

热门文章

  1. PS_0002:改变曲线,改变色阶
  2. Pikachu-目录遍历
  3. centos 7 安装npm
  4. 剑指offer-面试题15-二进制中1的个数-位运算
  5. 汇编语言中LABEL伪指令的功能?
  6. Docker学习参考网站
  7. Canvas如何绘制精美的图?
  8. 小总结:快速幂+贪心————Bit Mask____UVA 10718 多多去理解去温习哦!
  9. python3练习100题——039
  10. float浮动造成高度塌陷的解决办法