opencv笔记二十三(像素重映射remap函数)


API:

remap( InputArray src,// 输入图像 

OutputArray dst,// 输出图像 

InputArray map1,// x 映射表 必须为:CV_16SC2/CV_32FC1/CV_32FC2 

InputArray map2,// y 映射表 

int interpolation,// 选择的插值方法,常见线性插值INTER_LINEAR,可选择立方等 

int borderMode,// BORDER_CONSTANT 

const Scalar borderValue// color )


实验代码如下:

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int n = 50, nm = 255;
char *c1 = "OLD", *c2 = "NEW";
Mat t1, t2, t3,x,y;
int i = 0;
void MAP(void);
int main(int argc, char** argv){	
	t1 = imread("houghc.png");
	if (!t1.data) {
		cout << "WRONG\n";
		return -1;
	}	
	x.create(t1.size(), CV_32FC1);
	y.create(t1.size(), CV_32FC1);

	while (1) {
		i = waitKey(500);
		if ((char)i == 27)break;
		i = i % 4;
		MAP();
		remap(t1, t2, x, y, INTER_LINEAR, BORDER_CONSTANT, Scalar(100, 150, 150));
		imshow(c1, t1);
		imshow(c2, t2);
	}
	
	waitKey(0);	
	return 0;
}

void MAP(void) {
	for (int row = 0; row < t1.rows; row++) {
		for (int col = 0; col < t1.cols; col++) {
			switch (i) {
			case 0://原图的1/2
				if (col > (t1.cols*0.25) && col<=(t1.cols*0.75) && row>(t1.rows*0.25) && row <=(t1.rows*0.75)) {
					x.at<float>(row, col) = 2 * (col - (t1.cols*0.25) );
					y.at<float>(row, col) = 2 * (row - (t1.rows*0.25) );
				}
				else {
					x.at<float>(row, col) = 0;
					y.at<float>(row, col) = 0;
				}
				break;
			case 1://左右颠倒
				x.at<float>(row, col) = (t1.cols - col - 1);
				y.at<float>(row, col) = row;
				break;
			case 2://上下颠倒
				x.at<float>(row, col) = col;
				y.at<float>(row, col) = t1.rows - row - 1;
				break;
			case 3://上下左右颠倒
				x.at<float>(row, col) = t1.cols - col - 1;
				y.at<float>(row, col) = t1.rows - row - 1;
				break;
			}
		}
	}
}


猜你喜欢

转载自blog.csdn.net/qq_31647835/article/details/80931783
今日推荐