OpenCV入门(十七)-- 透视变换
2014-11-03 22:58
232 查看
密集透视变换所用的函数与密集仿射变换类似,而且参数也相同。
对图像进行透视变换
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 。
计算透视映射矩阵的函数:
由四边形的4个点计算透射变换
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);
}
结果
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);
}
结果
相关文章推荐
- 【OpenCV入门教程之十七】OpenCV重映射 & SURF特征点检测合辑
- 【OpenCV入门教程之十七】OpenCV重映射 & SURF特征点检测合辑
- [转] 【OpenCV入门教程之十七】OpenCV重映射 & SURF特征点检测合辑
- 【OpenCV入门教程之十七】OpenCV重映射 & SURF特征点检测合辑
- 【OpenCV入门教程之十七】OpenCV重映射 & SURF特征点检测合辑
- 【OpenCV入门教程之十七】OpenCV重映射 & SURF特征点检测合辑
- 【QT】QT从零入门教程(十七):QT+OpenCV+VS 打包exe
- 【OpenCV入门教程之十七】OpenCV重映射 & SURF特征点检测合辑
- 【OpenCV入门教程之十七】OpenCV重映射 & SURF特征点检测合辑
- 【OpenCV入门教程之十七】OpenCV重映射 & SURF特征点检测合辑
- 【OpenCV入门教程之十七】OpenCV重映射 & SURF特征点检测合辑
- 【OpenCV入门教程之十七】OpenCV重映射 & SURF特征点检测合辑
- 【OpenCV入门教程之十七】OpenCV重映射 & SURF特征点检测合辑
- 【OpenCV入门指南】第二篇 缩放图像
- OpenCV 入门(很详细) 转译
- 【OpenCV入门指南】第九篇 灰度直方图均衡化
- OpenCV 编程入门
- 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置(转)
- 【OpenCV入门指南】第五篇 轮廓检测 上
- VS2013/MFC编程入门之十七(对话框:字体对话框)