Opencv 中重映射的remap函数中map_x,map_y的困惑说明
2017-03-05 19:43
471 查看
看到好东西就想转载分享给大家~!
来源:http://blog.csdn.net/jialeheyeshu/article/details/50903835
在使用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++)//clos表示图像的宽,row表示图像的高
{
//-----上下变换----使坐标的纵坐标数值不变,横坐标从大到小排列(原图中纵坐标是从小到大排列的)
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是高.
来源:http://blog.csdn.net/jialeheyeshu/article/details/50903835
在使用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++)//clos表示图像的宽,row表示图像的高
{
//-----上下变换----使坐标的纵坐标数值不变,横坐标从大到小排列(原图中纵坐标是从小到大排列的)
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是高.
相关文章推荐
- opencv重映射remap( )函数
- opencv中的重映射:remap()函数
- Android Jni opencv中的重映射:remap()函数
- 使用文件映射的方式进行共享数据中CreateFileMapping、MapViewOfFile函数参数说明
- Opencv::findContours函数参数说明及相关函数
- 封装opencvdll 的函数说明
- OpenCV中寻找轮廓函数cvFindContours的使用说明以及序列cvSeq的用法说明
- OpenCV中寻找轮廓函数cvFindContours的使用说明以及序列cvSeq的用法说明
- php array_map()数组函数使用说明
- OpenCV中用于摄像头视频读取的函数说明
- OpenCV混合高斯模型函数注释说明
- OpenCV混合高斯模型函数注释说明
- 单尺度视网膜滤波器代码中OpenCV函数说明
- CvCreateImage函数说明以及一些OpenCv中函数的相关说明
- OpenCV中用于图片显示的函数参数说明
- 【OpenCV学习笔记】【函数学习】十四(cvSeq的用法说明(功能很多,按照需求使用))
- OPENCV中cvFindContours函数说明
- Opencv cvFindContours 函数的详细说明
- OPENCV中cvFindContours函数说明
- opencv CvCreateImage函数说明