int main(int argc, char** argv) { Mat srcImage, dstImage; Mat map_x, map_y; namedWindow("程序窗口"); //载入原始图 srcImage = imread("test.jpg", 1); //创建和原始图一样的效果图,x重映射图,y重映射图 dstImage.create(srcImage.size(), srcImage.type()); map_x.create(srcImage.size(), CV_32FC1); map_y.create(srcImage.size(), CV_32FC1); //双层循环,遍历每一个像素点,改变map_x & map_y的值 for (int j = 0; j < srcImage.rows; j++) { for (int i = 0; i < srcImage.cols; i++) { //改变map_x & map_y的值. map_x.at<float>(j, i) = static_cast<float>(i); map_y.at<float>(j, i) = static_cast<float>(srcImage.rows - j); / //map_x.at<float>(j, i) = static_cast<float>(srcImage.cols-i); // map_y.at<float>(j, i) = static_cast<float>(j); /// //map_x.at<float>(j, i) = static_cast<float>(srcImage.cols-i); //map_y.at<float>(j, i) = static_cast<float>(srcImage.rows - j); / //map_x.at<float>(j, i) = static_cast<float>(2*( i - srcImage.cols*0.25 ) + 0.5); //map_y.at<float>(j, i) = static_cast<float>(2*( j - srcImage.rows*0.25 ) + 0.5); } } //进行重映射操作 remap(srcImage, dstImage, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0)); imshow("程序窗口", dstImage); waitKey(30); return(0); }
C++: void remap(InputArray src, OutputArraydst, InputArray map1, InputArray map2, int interpolation, intborderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可,且需为单通道8位或者浮点型图像。
第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放函数调用后的输出结果,需和源图片有一样的尺寸和类型。第三个参数,InputArray类型的map1,它有两种可能的表示对象。 表示点(x,y)的第一个映射。表示CV_16SC2 , CV_32FC1 或CV_32FC2类型的X值。 第四个参数,InputArray类型的map2,同样,它也有两种可能的表示对象,而且他是根据map1来确定表示那种对象。 若map1表示点(x,y)时。这个参数不代表任何值。表示CV_16UC1 , CV_32FC1类型的Y值(第二个值)。