void remap(InputArray src,OutputArray dst,InputArray map_x,InputArray map_y,int interpolation,int border_Mode = BORDER_CONSTANT,const Scalar &borderValue = Scalar() )
参数一、二:输入输出阵列
参数三:1、表示点(x,y)的第一个映射,2、表示CV_16SC2、CV_32FC1 或CV_32FC2类型的X值
参数四:1、表示点(x,y)的第一个映射,2、表示CV_16SC2、CV_32FC1 或CV_32FC2类型的X值
参数五:插值方式:1、INTER_NEAREST 最近邻 2、INTER_LINEAR线性 3、INTER_CUBIC 双三次样条 4、INTER_LANCZOS lnaczos插值
参数六:边界类型
参数七:常数边界时使用的值,默认0
示例:
#include <iostream>
#define WINDOW_NAME "【程序窗口】"
using namespace std;
using namespace cv;
Mat g_srcImage,g_dstImage;
Mat g_map_x,g_map_y;
int update_map(int key);
int main(int argc,char *argv[])
{
if(argc!=2)
{
cout<<"input error"<<endl;
return -1;
}
g_srcImage = imread(argv[1]);
if(g_srcImage.empty())
{
cout<<"read fail"<<endl;
return -1;
}
imshow("【原图】",g_srcImage);
g_dstImage.create(g_srcImage.size(),g_srcImage.type());
g_map_x.create(g_srcImage.size(),CV_32FC1);
g_map_y.create(g_srcImage.size(),CV_32FC1);
namedWindow(WINDOW_NAME,WINDOW_AUTOSIZE);
while(1)
{
int key = waitKey(0);
if((key & 255) == 27)
{
cout<<"程序退出......."<<endl;
break;
}
update_map(key);
remap(g_srcImage,g_dstImage,g_map_x,g_map_y,INTER_LINEAR,BORDER_CONSTANT,Scalar(0,0,0));
imshow(WINDOW_NAME,g_dstImage);
}
return 0;
}
int update_map(int key)
{
for(int i=0;i<g_srcImage.rows;i++)
{
for(int j=0;j<g_srcImage.cols;j++)
{
switch(key)
{
case '1':
if(j>g_srcImage.cols*0.25 && j<g_srcImage.cols*0.75 && i>g_srcImage.rows*0.25 && i<g_srcImage.rows*0.75)
{
g_map_x.at<float>(i,j) = static_cast<float>(2*(j-0.25*g_srcImage.cols)+0.6);
g_map_y.at<float>(i,j) = static_cast<float>(2*(i-0.25*g_srcImage.rows)+0.6);
}
else
{
g_map_x.at<float>(i,j) = 0;
g_map_y.at<float>(i,j) = 0;
}
break;
case '2':
g_map_x.at<float>(i,j) = static_cast<float>(j);
g_map_y.at<float>(i,j) = static_cast<float>(g_srcImage.rows - i);
break;
case '3':
g_map_y.at<float>(i,j) = static_cast<float>(i);
g_map_x.at<float>(i,j) = static_cast<float>(g_srcImage.cols - j);
break;
case '4':
g_map_x.at<float>(i,j) = static_cast<float>(g_srcImage.cols - j);
g_map_y.at<float>(i,j) = static_cast<float>(g_srcImage.rows - i);
break;
}
}
}
return 1;
}
转自:opencv编程入门 毛星云pdf 多重映射综合实例