在使用remap函数时一直没明白那个map_x,和map_y一直搞混了,通过实验来记录一下以防以后忘记了
先看一段代码
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat srcImage=imread("1.jpg",1);
imshow("yuantu",srcImage);
Mat dstImage,map_x,map_y;
dstImage.create(srcImage.size(),srcImage.type());
map_x.create(srcImage.size(),CV_32FC1);
map_y.create(srcImage.size(),CV_32FC1);
for(int i=0;i<srcImage.rows;i++)
for(int j=0;j<srcImage.cols;j++)
{
//---------上下变换
map_x.at<float>(i,j)=static_cast<float>(j);
map_y.at<float>(i,j)=static_cast<float>(srcImage.rows-i);
//--------------左右变换
//map_x.at<float>(i,j)=static_cast<float>(i);//x轴横着的
//map_y.at<float>(i,j)=static_cast<float>(srcImage.cols-j);//y轴竖着的
}
remap(srcImage,dstImage,map_x,map_y,INTER_LINEAR);
imshow("xianshi",dstImage);
waitKey(0);
return 0;
}
代码中的map_x实际上记录的是对应srcImage中(i,j)位置的横坐标,map_y实际上记录的是(i,j)位置的纵坐标,而我们在这里把像素操作的i当做了横坐标,j当做了纵坐标。
所以有时会混淆怎么赋值.看看下图:
map_x是横着跑的,map_y是竖着跑的。来具体看看像素:
假设这是一个图片
map_x上面对应的是:
map_y是:
所以如果我要让第一行的12和98换位置,那么
map_x:
3 1 2 0
0 1 2 3
0 1 2 3
map_y不变
而我们表示像素的的时候12是srcImage.at<uchar>(0,0) 98是srcImage.at<uchar>(0,3);
简写a(i1,j1),a(i1,j2);很容易误认为换j,而这里map_x可以看成是在屏幕x轴(左上角横着的)的值,map_y可以看成是屏幕y轴(左上角往下)的值,那么map_x存的是像素表示中的j值(列),map_y存的是像素表示中的i值(行).这和用图像构建一个矩形是一样的image.cols是宽,image.row是高.