欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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时即水平翻转,运行结果如下:

opencv学习笔记十六:像素重映射

按1时即竖直翻转,运行结果如下:

opencv学习笔记十六:像素重映射

按2时即水平竖直翻转,运行结果如下: 

opencv学习笔记十六:像素重映射

相关标签: 像素重映射