1)remap()函数:
重映射是指把一个图像中的一个位置的像素通过映射关系转换到另一图像的指定位置。对于输入原图像f(x,y),目标图像g(x,y),映射关系为T,则满足下式:
g(x,y) = T(f(x, y))
lmap1:表示(x,y)点的坐标或x坐标,CV_16SC2,CV_32FC1,CV_32FC2类型
lmap2:表示(x,y)点y坐标,如果map1为(x,y),map2可以选择不用,可以是
CV_16UC1, CV_32FC1
linterpolation:表示插值方法
lborderMode:表示边界插值类型
lborderValue:表示插值数值
#include"opencv2/opencv.hpp"
using namespace cv;
void main()
{
Mat srcImg = imread("1.jpg");
Mat dstImg;
/*transpose(srcImg, dstImg);
flip(dstImg, dstImg, 0);*/
int rows = srcImg.rows;
int cols = srcImg.cols;
Mat xMapImg = Mat::zeros(srcImg.size(), CV_32FC1); //map1
Mat yMapImg = Mat::zeros(srcImg.size(), CV_32FC1); //map2
for (int i = 0; i< rows; i++)
{
for (int j = 0; j<cols; j++)
{
xMapImg.at<float>(i, j) = j; //列的不变(!!这里存的是映射,即:srcImg的坐标X的位置)
yMapImg.at<float>(i, j) = i + 5 * sin(j/10.0);//行的位置变为(i + 5 * sin(j/10.0))(!!即:srcImg的坐标y的位置)
}
}
remap(srcImg, dstImg, xMapImg, yMapImg, CV_INTER_LINEAR);
imshow("src", srcImg);
imshow("dst", dstImg);
waitKey(0);
}