您的位置:首页 > 运维架构

OpenCV入门(十七)-- 透视变换

2014-11-03 22:58 232 查看
密集透视变换所用的函数与密集仿射变换类似,而且参数也相同。


WarpPerspective

对图像进行透视变换
void cvWarpPerspective( const CvArr* src, CvArr* dst, const CvMat* map_matrix,
int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,
CvScalar fillval=cvScalarAll(0) );

src输入图像.dst输出图像.map_matrix3×3 变换矩阵flags插值方法和以下开关选项的组合:
CV_WARP_FILL_OUTLIERS - 填充所有缩小图像的象素。如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval.
CV_WARP_INVERSE_MAP - 指定 matrix 是输出图像到输入图像的反变换,因此可以直接用来做象素插值。否则, 函数从 map_matrix 得到反变换。
fillval用来填充边界外面的值
函数 cvWarpPerspective 利用下面指定矩阵变换输入图像: 


如果没有指定 CV_WARP_INVERSE_MAP , 

 ,
否则,


要变换稀疏矩阵,使用 cxcore 中的函数 cvTransform 。

计算透视映射矩阵的函数:


GetPerspectiveTransform

由四边形的4个点计算透射变换
CvMat* cvGetPerspectiveTransform( const CvPoint2D32f* src, const CvPoint2D32f* dst,
CvMat* map_matrix );

#define cvWarpPerspectiveQMatrix cvGetPerspectiveTransform

src输入图像的四边形顶点坐标。dst输出图像的相应的四边形顶点坐标。map_matrix指向3×3输出矩阵的指针。
函数cvGetPerspectiveTransform计算满足以下关系的透射变换矩阵:



这里,dst(i) = (x'i,y'i),src(i) = (xi,yi),i =
0..3.
实现代码:

/*
透视变换
*/

#include"highgui.h"
#include"cv.h"

void doPerspective(IplImage* img)
{
CvPoint2D32f srcQuad[4], dstQuad[4];
CvMat* warp_matrix = cvCreateMat(3,3, CV_32FC1);
IplImage *dst;
dst = cvCloneImage(img);
dst->origin = img->origin;
cvZero(dst);
srcQuad[0].x = 0;
srcQuad[0].y = 0;
srcQuad[1].x = img->width -1;
srcQuad[1].y = 0;
srcQuad[2].x = 0;
srcQuad[2].y = img->height -1;
srcQuad[3].x = img->width -1;
srcQuad[3].y = img->height -1;

dstQuad[0].x = img->width*0.05;
dstQuad[0].y = img->height*0.33;
dstQuad[1].x = img->width*0.9;
dstQuad[1].y = img->height*0.25;
dstQuad[2].x = img->width*0.2;
dstQuad[2].y = img->height*0.7;
dstQuad[3].x = img->width*0.8;
dstQuad[3].y = img->height*0.9;

cvGetPerspectiveTransform(
srcQuad,
dstQuad,
warp_matrix
);
cvWarpPerspective(img, dst, warp_matrix);

cvNamedWindow("Perspective",1);
cvShowImage("Perspective",dst);

cvWaitKey(0);
cvReleaseImage(&dst);
cvReleaseMat(&warp_matrix);
}

结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: