演示代码:#include
#include
#include
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
for (int col = 0; col
switch (2) {
case 0: //变成原来1/2
if (col > (src.cols * 0.25) && col
row>(src.rows * 0.25) && row
mapx.at(row, col) = 2 * (col - (src.cols * 0.25) + 0.5);
mapy.at(row, col) = 2 * (row - (src.rows * 0.25) + 0.5);
}
else {
mapx.at(row, col) = 0;
mapy.at(row, col) = 0;
}
break;
case 1: //x方向对调
mapx.at(row, col) = (src.cols - col - 1);
mapy.at(row, col) = row;
break;
case 2: //y方向对调
mapx.at(row, col) = col;
mapy.at(row, col) = (src.rows - row - 1);
break;
case 3: //xy方向周时对调
mapx.at(row, col) = (src.cols - col - 1);
mapy.at(row, col) = (src.rows - row - 1);
break;
}
}
}
}
(0 缩小1/2)
(1 x方向对调)
(2 y方向对调)
(3 x,y方向同时对调)
代码说明:
什么是像素重映射
简单点说就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去,形成一张新的图像。
假设有映射函数
API介绍cv::remapRemap(
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
版权声明:本文章代码及资料部分或全部来自贾志刚老师的视频,勇哥只是在个人理解的基础上做学习笔记,转载请附上博文链接!
#转载请注明出处 www.skcircle.com 《少有人走的路》勇哥的工业自动化技术网站。如果需要本贴图片源码等资源,请向勇哥索取。
收藏 | 0点赞 | 0打赏作者