??????? cvRemap 對圖像進行普通幾何變換
??????? 函數 cvRemap 利用下面指定的矩陣變換輸入圖像:
dst(x,y)<-src(mapx(x,y),mapy(x,y))
與其它幾何變換類似,可以使用一些插值方法(由用戶指定,同cvResize)來計算非整數坐標的像素值
void cvRemap( const CvArr* src, CvArr* dst,const CvArr* mapx, const CvArr* mapy,int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,CvScalar fillval=cvScalarAll(0) );
??????? src?????????? ? 輸入圖像.dst?????????? ? 輸出圖像.
mapx??????? x坐標的映射 (32fC1 image).
mapy??????? y坐標的映射 (32fC1 image).
flags???????? 插值方法和以下開關選項的組合:
????????????????? CV_WARP_FILL_OUTLIERS - 填充邊界外的像素. 如果輸出圖像的部分象素落在變換后的邊界外,那么它們的值設定為 fillval。
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <iostream>
int Remap(int argc,char** argv)
{
uchar DataSrc[]={1,2,3,4,5,6,7,8,9
};
CvMat MatSrc;
cvInitMatHeader(&MatSrc,3,3,CV_8UC1,DataSrc); //初始化矩陣
CvMat *MatDst=cvCreateMat(3,3,CV_8UC1); //創建矩陣
//cvInitMatHeader(&MatDst,3,3,CV_8UC1);
float DataMapx[]={1,2,0, //cvRemap函數的mapx一定要為float型1,2,0,1,2,0
};
CvMat mapx;
cvInitMatHeader(&mapx,3,3,CV_32FC1,DataMapx); //注意類型是CV_32FC1
float DataMapy[]={0,0,1,1,1,2,2,2,0
};
CvMat mapy;
cvInitMatHeader(&mapy,3,3,CV_32FC1,DataMapy);
cvRemap(&MatSrc,MatDst,&mapx,&mapy,CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS);
//打印原矩陣
std::cout<<"MatSrc=\'#\'" //打印mapx
std::cout<<"mapx:"<<std::endl;
for(int rows=0;rows<mapx.height;rows++)
{
float *DataPt=(float*)(mapx.data.ptr+rows*mapx.step);
for(int cols=0;cols<mapx.width;cols++)
{
float data=*(DataPt+cols);
std::cout<<(float)data<<" ";
}
std::cout<<std::endl;
}
//打印mapy
std::cout<<"mapy:"<<std::endl;
for(int rows=0;rows<mapy.height;rows++)
{
float *DataPt=(float*)(mapy.data.ptr+rows*mapy.step);
for(int cols=0;cols<mapy.width;cols++)
{
float data=*(DataPt+cols);
std::cout<<(float)data<<" ";
}
std::cout<<std::endl;
}
//打印結果矩陣
std::cout<<"MatDst:"<<std::endl;
for(int rows=0;rows<MatDst->height;rows++)
{
uchar *DataPt=(uchar*)(MatDst->data.ptr+rows*MatDst->step);
for(int cols=0;cols<MatDst->width;cols++)
{
uchar data=*(DataPt+cols);
std::cout<<(int)data<<" ";
}
std::cout<<std::endl;
}
return 0;
}