函数功能
remap():图像的重映射
函数原型
void cv::remap(InputArray src,
OutputArray dst,
InputArray map1, 可以是(x,y)的映射,也可以是单独的X的映射
InputArray map2, 如果map1为(x,y)的映射则可以为NULL,否则为y的映射
int interpolation, // 插值方式
int borderMode = BORDER_CONSTANT, // 边界填充方式
const Scalar & borderValue = Scalar()
)
Python:
cv.remap( src, map1, map2, interpolation[, dst[, borderMode[, borderValue]]] ) -> dst
//dst(x,y)=src(mapx(x,y),mapy(x,y))
实例
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
Mat mImage = imread("F:\\desktop\\OpenCV_study\\my.jpg", IMREAD_ANYCOLOR);
namedWindow("The original image", WINDOW_NORMAL);
imshow("The original image", mImage);
Mat mResult = mImage.clone();
//mMapX和mMapY的数据类型必须是 CV_16SC2 ,CV_32FC1, or CV_32FC2.
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;
// mapX和mapY是rows行,col列的二维数组
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);// 每个位置填上对应位置的位置序号
// ptrX[j] = (float)(Cols - j-1);二者效果相同
ptrY[j] = (float)i;
/*********************************************/
//上下翻转
//ptrX[j] = (float)j;
//ptrY[j] = (float)(Rows - i);
// 缩小一半
//if (col > (Cols * 0.25) && col <= (Cols*0.75) && row > (Rows*0.25) && Ros <= (src.rows*0.75)) {
// ptrX[j]= 2 * (j - (Cols*0.25));
// ptrY[i] = 2 * (i - (Rows*0.25));
// }
// else {
// ptrX[j] = 0;
// ptrY[i] = 0;
// }
}
}
remap(mImage, mResult, mMapX, mMapY, INTER_LINEAR);//重映射
namedWindow("The processed image", WINDOW_NORMAL);
imshow("The processed image", mResult);
waitKey();
destroyAllWindows();
return 0;
}