首先介绍一下remap函数! remap就是用来做重映射的,重映射的含义这里先不讲,大家看完这篇文章就知道了!函数原型如下: C++: void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())参数src:输入图像,即源图像。参数dst:目标图像,需和源图片有一样的尺寸和类型。参数map1:里面存储着源图像中各像素点的x坐标在目标图像中的x坐标,x坐标其实就是像素点列号。参数map2:里面存储着源图像中各像素点的y坐标在目标图像中的y坐标,y坐标其实就是像素点列号。参数interpolation:插值方式,可选的插值方式如下: INTER_NEAREST - 最近邻插值 INTER_LINEAR – 双线性插值(默认值) INTER_CUBIC – 双三次样条插值(4×4像素邻域内的双三次插值) INTER_LANCZOS4 -Lanczos插值(8×8像素邻域的Lanczos插值)参数borderMode:int类型:borderMode,边界模式,有默认值BORDER_CONSTANT,表示目标图像中“离群点(outliers)”的像素值不会被此函数修改,此时这些点的值由borderValue决定。离群点我猜应该是没有被映射的点。参数borderValue:当参数borderMode设为BORDER_CONSTANT,其值决定了离群点的取值,有默认值,默认值为0。代码流程如下: 读取源图像→利用remap函数做重沿x和y方向的翻转操作→显示源图像和翻转后的图像使用示例代码如下:源码中所需的图片下载链接:http://pan.baidu.com/s/1i5mU66D 密码:czyx
//opencv版本:OpenCV3.0 //VS版本:VS2013 #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/types_c.h> #include <iostream> int main(){ cv::Mat src = cv::imread("remap_pic.jpg"); cv::Mat map_x_1, map_y_1, map_x_2, map_y_2, map_x_3, map_y_3; map_x_1.create(src.size(), CV_32FC1); map_y_1.create(src.size(), CV_32FC1); map_x_2.create(src.size(), CV_32FC1); map_y_2.create(src.size(), CV_32FC1); map_x_3.create(src.size(), CV_32FC1); map_y_3.create(src.size(), CV_32FC1); for (int iH = 0; iH<src.rows; iH++){ for (int iW = 0; iW<src.cols; iW++){ map_x_1.at<float>(iH, iW) = iW; map_y_1.at<float>(iH, iW) = src.rows - iH; map_x_2.at<float>(iH, iW) = src.cols - iW; map_y_2.at<float>(iH, iW) = iH; map_x_3.at<float>(iH, iW) = src.cols - iW; map_y_3.at<float>(iH, iW) = src.rows - iH; } } cv::Mat dst1, dst2, dst3; remap(src, dst1, map_x_1, map_y_1, CV_INTER_LINEAR); remap(src, dst2, map_x_2, map_y_2, CV_INTER_LINEAR); remap(src, dst3, map_x_3, map_y_3, CV_INTER_LINEAR); cv::imshow("origin", src); cv::imshow("remap_1", dst1); cv::imshow("remap_2", dst2); cv::imshow("remap_3", dst3); cv::waitKey(0); return 0; }运行结果如下图所示: