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;
}