Opencv 投射变换代码,代码很简单,但是也记录一下
公式为
Dst x,y,z为变化过后的坐标
Src x,y,z为变换签坐标
H为投射矩阵
void cv::perspectiveTransform( InputArray _src, OutputArray _dst, InputArray _mtx )
{
Mat src = _src.getMat(), m = _mtx.getMat();//从接口类导出Mat
int depth = src.depth(), scn = src.channels(), dcn = m.rows-1;//获得深度及通道数
CV_Assert( scn + 1 == m.cols && (depth == CV_32F || depth == CV_64F));
_dst.create( src.size(), CV_MAKETYPE(depth, dcn) );//分配内存
Mat dst = _dst.getMat();
const int mtype = CV_64F;
AutoBuffer<double> _mbuf;
double* mbuf = _mbuf;
if( !m.isContinuous() || m.type() != mtype )//判断数据存储是否连续,以及类型是否是64位浮点
{
_mbuf.allocate((dcn+1)*(scn+1));
Mat tmp(dcn+1, scn+1, mtype, (double*)_mbuf);