图像的透视变换

          前几天写了一篇图像的仿射变换,因为图像的仿射变换是图像透视变换的子集,所以了解掌握图像的仿射变换是很重要的。

        以下参考了学习opencv中文版

       透视变换(单应性映射)能提供更大的灵活性,但是一个透视投影并不是线性变换,因此所采用的映射矩阵是3*3,且控点变为4个,其他方面与仿射变换完全类似,下面的例程是针对密集变换,稀疏图像变换则采用cvPerspectiveTransform函数来处理。

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_matrix

3×3 变换矩阵

flags

插值方法和以下开关选项的组合:

·       CV_WARP_FILL_OUTLIERS- 填充所有缩小图像的象素。如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval.

·       CV_WARP_INVERSE_MAP- 指定 matrix 是输出图像到输入图像的反变换,因此可以直接用来做象素插值。否则, 函数从 map_matrix 得到反变换。

fillval

用来填充边界外面的值

函数 cvWarpPerspective 利用下面指定矩阵变换输入图像:

  • 如果没有指定 CV_WARP_INVERSE_MAP , 
  • 否则, 

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


GetPerspectiveTransform

由四对点计算透射变换

CvMat* cvGetPerspectiveTransform( const CvPoint2D32f*src, const CvPoint2D32f* dst,

                                  CvMat*map_matrix );

 

#define cvWarpPerspectiveQMatrixcvGetPerspectiveTransform

src

输入图像的四边形顶点坐标。

dst

输出图像的相应的四边形顶点坐标。

map_matrix

指向3×3输出矩阵的指针。

函数cvGetPerspectiveTransform计算满足以下关系的透射变换矩阵:


这里,dst(i)= (x'i,y'i),src(i)= (xi,yi),i = 0..3.

       矩阵Mat既可以是3*3的,也可以是4*4的,如果是前者,便投影从二维变成二维,后者则从四维变成三维,当然,我们将一副图像中的点集转换成另一副图的点集,听起来似乎是两维映射到两维。但这并不是准确的,因为透视变换实际上是一个嵌入在三维空间的二维平面上的实际映射点映射回一个不同的二维子空间,可以把它想成摄像机的行为。摄像机得到三维空间的点,然后利用成像仪映射到二维空间。

代码如下:


#include <cv.h>
#include <highgui.h>

int main(int argc, char** argv)
{
	CvPoint2D32f srcQuad[4], dstQuad[4];
	CvMat* warp_matrix = cvCreateMat(3,3,CV_32FC1);
	IplImage *src, *dst;
	if( argc == 2 && ((src=cvLoadImage(argv[1],1)) != 0 ))//在项目属性下的调试中的命令参数添加图像的路径
	{
		dst = cvCloneImage(src);
		dst->origin = src->origin;
		cvZero(dst);

		srcQuad[0].x = 0;           //src Top left
		srcQuad[0].y = 0;
		srcQuad[1].x = src->width - 1;  //src Top right
		srcQuad[1].y = 0;
		srcQuad[2].x = 0;           //src Bottom left
		srcQuad[2].y = src->height - 1;
		srcQuad[3].x = src->width - 1;  //src Bot right
		srcQuad[3].y = src->height - 1;
		//- - - - - - - - - - - - - -//
		dstQuad[0].x = src->width*0.05;  //dst Top left
		dstQuad[0].y = src->height*0.33;
		dstQuad[1].x = src->width*0.9;  //dst Top right
		dstQuad[1].y = src->height*0.25;
		dstQuad[2].x = src->width*0.2;  //dst Bottom left
		dstQuad[2].y = src->height*0.7;      
		dstQuad[3].x = src->width*0.8;  //dst Bot right
		dstQuad[3].y = src->height*0.9;

		cvGetPerspectiveTransform(srcQuad,dstQuad,
			warp_matrix);
		cvWarpPerspective(src,dst,warp_matrix);
		cvNamedWindow( "Perspective_Warp", 1 );
		cvShowImage( "Perspective_Warp", dst );
		cvWaitKey();
	}
	cvReleaseImage(&dst);
	cvReleaseMat(&warp_matrix);
	return 0;
}

结果如下:







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值