演示代码:
#include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespace cv; using namespace std; int index = 0; Mat src, dst,mapx,mapy; void updateMap(void); const char* OUTTITLE = "remap"; int main(int argc, char** argv) { src = imread("e:/girl.png"); namedWindow("src", CV_WINDOW_AUTOSIZE); namedWindow(OUTTITLE, CV_WINDOW_AUTOSIZE); imshow("src", src); mapx.create(src.size(), CV_32FC1); mapy.create(src.size(), CV_32FC1); int c = 0; while (true) { c = waitKey(500); if ((char)c == 27) { break; } index = c % 4; updateMap(); remap(src, dst, mapx, mapy, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 255, 255)); imshow(OUTTITLE,dst); } waitKey(0); return 0; } void updateMap(void) { for (int row = 0; row < src.rows; row++) { for (int col = 0; col < src.cols; col++) { switch (2) { case 0: //变成原来1/2 if (col > (src.cols * 0.25) && col<(src.cols * 0.75) && row>(src.rows * 0.25) && row < (src.rows * 0.75)) { mapx.at<float>(row, col) = 2 * (col - (src.cols * 0.25) + 0.5); mapy.at<float>(row, col) = 2 * (row - (src.rows * 0.25) + 0.5); } else { mapx.at<float>(row, col) = 0; mapy.at<float>(row, col) = 0; } break; case 1: //x方向对调 mapx.at<float>(row, col) = (src.cols - col - 1); mapy.at<float>(row, col) = row; break; case 2: //y方向对调 mapx.at<float>(row, col) = col; mapy.at<float>(row, col) = (src.rows - row - 1); break; case 3: //xy方向周时对调 mapx.at<float>(row, col) = (src.cols - col - 1); mapy.at<float>(row, col) = (src.rows - row - 1); break; } } } }
(0 缩小1/2)
(1 x方向对调)
(2 y方向对调)
(3 x,y方向同时对调)
代码说明:
什么是像素重映射
简单点说就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去,形成一张新的图像。
假设有映射函数
API介绍cv::remap
Remap( InputArray src,// 输入图像 OutputArray dst,// 输出图像 InputArray map1,// x 映射表 CV_32FC1/CV_32FC2 InputArray map2,// y 映射表 int interpolation,// 选择的插值方法,常见线性插值,可选择立方等 int borderMode,// BORDER_CONSTANT const Scalar borderValue// color )
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文章代码及资料部分或全部来自贾志刚老师的视频,勇哥只是在个人理解的基础上做学习笔记,转载请附上博文链接!
本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:


