https://www.cnblogs.com/HL-space/p/10546595.html
重映射,就是把一幅图像中某位置的像素放置到另一图像指定位置的过程。即:
在重映射过程中,图像的大小也可以同时发生改变。此时像素与像素之间的关系就不是一一对应关系,因此在重映射过程中,可能会涉及到像素值的插值计算。
src:输入图像,灰度图或真彩图均可。
dst:输出图像,要求大小和xmap,ymap相同,通道数目及数据类型和src相同。
xmap:用于存放图像X方向的映射关系,类型必须是CV_32FC1的。
ymap:用于存放图像Y方向的映射关系,类型必须是CV_32FC1的。
interpolation:插值方式。
borderMode:图像边界处理方式,边界的类型有以下几种:
1)BORDER_REPLICATE:重复: aaaaaa|abcdefgh|hhhhhhh
2)BORDER_REFLECT:反射: fedcba|abcdefgh|hgfedcb
3)BORDER_REFLECT_101:反射101: gfedcb|abcdefgh|gfedcba
4)BORDER_WRAP:外包装: cdefgh|abcdefgh|abcdefg
5)BORDER_CONSTANT:常量复制: iiiiii|abcdefgh|iiiiiii(i的值由后一个参数Scalar()确定,如Scalar::all(0) )
borderValue:若上一参数为BORDER_CONSTANT,则由此参数确定补充上去的像素值。可选用默认值。
二、程序及结果分享
#include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> using namespace std; using namespace cv; int main() { Mat mImage = imread("goalkeeper.jpg"); if (mImage.data == 0) { cerr << "Image reading error !" << endl; system("pause"); return -1; } namedWindow("The original image", WINDOW_NORMAL); imshow("The original image", mImage); Mat mResult = mImage.clone(); //mMapX和mMapY的数据类型必须是 CV_32FC1 Mat mMapX(mImage.rows, mImage.cols, CV_32FC1, Scalar(0)); Mat mMapY(mImage.rows, mImage.cols, CV_32FC1, Scalar(0)); int Rows = mImage.rows; int Cols = mImage.cols; for (int i = 0; i <Rows; i++) { float* ptrX = mMapX.ptr<float>(i); float* ptrY = mMapY.ptr<float>(i); for (int j = 0; j < Cols; j++) { //左右翻转 ptrX[j] =(float)(Cols - j); ptrY[j] = (float) i; //上下翻转 //ptrX[j] = (float)j; //ptrY[j] = (float)(Rows - i); } } remap(mImage, mResult, mMapX, mMapY, INTER_LINEAR);//重映射 namedWindow("The processed image",WINDOW_NORMAL); imshow("The processed image", mResult); waitKey(); destroyAllWindows(); return 0; }