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

密集透视变换所用的函数与密集仿射变换类似,而且参数也相同。

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 利用下面指定矩阵变换输入图像: dst(x',y') \leftarrow src(x,y)

  • 如果没有指定 CV_WARP_INVERSE_MAP , (x',y')^T=map\_matrix \cdot (x,y,1)^T ,
  • 否则,(x, y)^T=map\_matrix \cdot (x',y',1)^T

要变换稀疏矩阵,使用 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计算满足以下关系的透射变换矩阵:

(t_ix'_i,t_iy'_i,t_i)^T=map\_matrix\cdot(x_i,y_i,1)^T

这里, 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);
}

结果





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值