openCV学习10-像素重映射

1.像素重映射


↑例如照镜子,我们就是原图像,镜子就是功能函数,镜子中我们的像就是重映射之后的图像


#include <opencv2\core\core.hpp>  
#include <opencv2\highgui\highgui.hpp>  
#include <opencv2\imgproc\imgproc.hpp>  
#include <opencv2\objdetect\objdetect.hpp>  
#include <opencv2\imgproc\types_c.h>  
#include <opencv2\objdetect\objdetect_c.h>
#include<opencv2/opencv.hpp>
#include<iostream>
#include<cmath>
#include<cstdio>

using namespace std;
using namespace cv;

Mat src,dst,map_x,map_y;
int index=0;

void updatemap()
{
	for(int row=0;row<src.rows;row++)
	{
		for(int col=0;col<src.cols;col++)
		{
			switch(index)
			{
			case 0:
				if(col>(src.cols*0.25)&&col<(src.cols*0.75)&&row>(src.rows*0.25)&&row<(src.rows*0.75))
				{
					map_x.at<float>(row,col)=(col-src.cols*0.25+0.5)*2;
					map_y.at<float>(row,col)=(row-src.rows*0.25+0.5)*2;
				}
				else
				{
					map_x.at<float>(row,col)=0;
					map_y.at<float>(row,col)=0;
				}
				break;
			case 1:
				map_x.at<float>(row,col)=src.cols-col-1;
				map_y.at<float>(row,col)=row;
				break;
			case 2:
				map_x.at<float>(row,col)=col;
				map_y.at<float>(row,col)=src.rows-row-1;
				break;
			case 3:
				map_x.at<float>(row,col)=src.cols-col-1;
				map_y.at<float>(row,col)=src.rows-row-1;
				break;
			}
		}
	}
}

int main()
{
	src=imread("cat.jpg");
	if(src.empty())
	{
		cout<<"!!???"<<endl;
		return -1;
	}
	namedWindow("cat!",1);
	namedWindow("out",1);
	imshow("cat!",src);

	map_x.create(src.size(),CV_32FC1);//32F-float
	map_y.create(src.size(),CV_32FC1);

	int c=0;
	while(true)
	{
		c=waitKey(50);
		index=c%4;
		if((char)c==27)
			break;
		updatemap();
		remap(src,dst,map_x,map_y,INTER_LINEAR,BORDER_CONSTANT,Scalar(0,255,255));
		imshow("out",dst);
	}
	waitKey(0);
	return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_39396954/article/details/80572044
今日推荐