opencv学习笔记十六:像素重映射
程序员文章站
2022-07-07 13:38:48
...
像素重映射主要有水平方向映射和竖直方向映射,水平方向map_ j = cols - j,左右两边像素对调,相当于水平镜像。竖直方向map_i = rows - i,上下两边像素对调,相当于竖直镜像。
重映射API函数:remap(src, dst, map_x, map_y, INTER_LINEAR, 0, Scalar(0, 255, 255));
参数解释:原图像,目标图像,x方向映射表,y方向映射表,插值方法,边界填充方法,颜色。
#include<opencv2/opencv.hpp>
using namespace cv;
void update_map(void);
Mat src, dst, map_x, map_y;
int index;
int main(int arc, char** argv)
{
src = imread("1.png");
namedWindow("input", CV_WINDOW_AUTOSIZE);
imshow("input", src);
map_x.create(src.size(), CV_32FC1);
map_y.create(src.size(), CV_32FC1);
while (true) {
int c = waitKey(500);
if ((char)c == 27) { break; }
index = c % 3;
update_map();
remap(src, dst, map_x, map_y, INTER_LINEAR, 0, Scalar(0, 255, 255));
imshow("output", dst);
}
waitKey(0);
return 0;
}
void update_map(void) {
for(int i=0;i<src.rows;i++)
for (int j = 0; j < src.cols; j++) {
switch (index) {
case 0:
map_x.at<float>(i, j) = src.cols - j;
map_y.at<float>(i, j) = i;
break;
case 1:
map_x.at<float>(i, j) = j;
map_y.at<float>(i, j) = src.rows - i;
break;
case 2:
map_x.at<float>(i, j) = src.cols - j;
map_y.at<float>(i, j) = src.rows - i;
break;
}
}
}
按0时即水平翻转,运行结果如下:
按1时即竖直翻转,运行结果如下:
按2时即水平竖直翻转,运行结果如下: