第六章 - 图像变换 - 图像拉伸、收缩、扭曲、旋转[2] - 透视变换(cvWarpPerspective)
透视变换(单应性?)能提供更大的灵活性,但是一个透视投影并不是线性变换,因此所采用的映射矩阵是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.
------------------------------------------------------------------------------------------------
/*code*/
- #include <highgui.h>
- #include <cv.h>
- int main(int argc, char** argv)
- {
- CvPoint2D32f srcTri[4], dstTri[4]; //二维坐标下的点,类型为浮点
- //CvMat* rot_mat = cvCreateMat( 2, 3, CV_32FC1 ); //多通道矩阵
- CvMat* warp_mat = cvCreateMat( 3, 3, CV_32FC1 );
- IplImage *src, *dst;
- if( argc == 2 && ( ( src = cvLoadImage( argv[1], 1 ) ) != 0 ) )
- {
- dst = cvCloneImage( src ); //制作图像的完整拷贝
- dst ->origin = src ->origin;
- /*
- int origin; /* 0 - 顶—左结构,
- 1 - 底—左结构 (Windows bitmaps 风格)
- */
- cvZero( dst ); //清空数组
- //计算矩阵仿射变换
- srcTri[0].x = 0;
- srcTri[0].y = 0;
- srcTri[1].x = src -> width - 1; //缩小一个像素
- srcTri[1].y = 0;
- srcTri[2].x = 0;
- srcTri[2].y = src -> height - 1;
- srcTri[3].x = src -> width - 1; //bot right
- srcTri[3].y = src -> height - 1;
- //改变目标图像大小
- dstTri[0].x = src -> width * 0.05;
- dstTri[0].y = src -> height * 0.33;
- dstTri[1].x = src -> width * 0.9;
- dstTri[1].y = src -> height * 0.25;
- dstTri[2].x = src -> width * 0.2;
- dstTri[2].y = src -> height * 0.7;
- dstTri[3].x = src -> width * 0.8;
- dstTri[3].y = src -> height * 0.9;
- cvGetPerspectiveTransform( srcTri, dstTri, warp_mat ); //由三对点计算仿射变换
- cvWarpPerspective( src, dst, warp_mat ); //对图像做仿射变换
- //输出
- cvNamedWindow( "Perspective Warp", 1 );
- cvShowImage( "Perspective Warp", dst ); //最终是输出dst
- cvWaitKey();
- }
- cvReleaseImage( &dst );
- cvReleaseMat( &warp_mat );
- return 0;
- }
第六章 - 图像变换 - 图像拉伸、收缩、扭曲、旋转[2] - 透视变换(cvWarpPerspective)的更多相关文章
- 第六章 - 图像变换 - 图像拉伸、收缩、扭曲、旋转[1] - 仿射变换(cvWarpAffine)
拉伸.收缩.扭曲.旋转是图像的几何变换,在三维视觉技术中大量应用到这些变换,又分为仿射变换和透视变换.仿射变换通常用单应性建模,利用cvWarpAffine解决密集映射,用cvTransform解决稀 ...
- 第五、六章:图像&链接
图像有很多存储格式:JPEG.png.gif等,它们的文件大小也不同,使用的图片类型对于页面响应速度有不同的要求.下面就会简单阐述不同的格式的图片的特点. 1.JPEG格式 JPEG格式适用于彩色照片 ...
- o'Reill的SVG精髓(第二版)学习笔记——第六章
第六章:坐标系统变换 想要旋转.缩放或者移动图片到新的位置.可以给对应的SVG元素添加transform属性. 6.1 translate变换 可以为<use>元素使用x和y属性,以在特性 ...
- Android群英传笔记——第六章:Android绘图机制与处理技巧
Android群英传笔记--第六章:Android绘图机制与处理技巧 一直在情调,时间都是可以自己调节的,不然世界上哪有这么多牛X的人 今天就开始读第六章了,算日子也刚好一个月了,一个月就读一半,这效 ...
- 精通Web Analytics 2.0 (8) 第六章:使用定性数据解答”为什么“的谜团
精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第六章:使用定性数据解答"为什么"的谜团 当我走进一家超市,我不希望员工会认出我或重新为我布置商店. 然而, ...
- Laxcus大数据管理系统2.0(8)- 第六章 网络通信
第六章 网络通信 Laxcus大数据管理系统网络建立在TCP/IP网络之上,从2.0版本开始,同时支持IPv4和IPv6两种网络地址.网络通信是Laxcus体系里最基础和重要的一环,为了能够利用有限的 ...
- 第六章 Qt布局管理器Layout
第六章 Qt布局管理器Layout 大家有没有发现一个现象,我们放置一个组件,给组件最原始的定位是给出这个控件的坐标和宽高值,这样Qt就知道这个组件的位置.当用户改变窗口的大小,组件还静静地呆在原来的 ...
- Android群英传》读书笔记 (3) 第六章 Android绘图机制与处理技巧 + 第七章 Android动画机制与使用技巧
第六章 Android绘图机制与处理技巧 1.屏幕尺寸信息屏幕大小:屏幕对角线长度,单位“寸”:分辨率:手机屏幕像素点个数,例如720x1280分辨率:PPI(Pixels Per Inch):即DP ...
- 第十六章——处理锁、阻塞和死锁(3)——使用SQLServer Profiler侦测死锁
原文:第十六章--处理锁.阻塞和死锁(3)--使用SQLServer Profiler侦测死锁 前言: 作为DBA,可能经常会遇到有同事或者客户反映经常发生死锁,影响了系统的使用.此时,你需要尽快侦测 ...
随机推荐
- php 获取代码执行时间和消耗的内存
做一些php性能测试的时候,要获取代码执行时间和消耗的内存,查了一下资料,发现php有自带的函数可以实现这个功能,具体实现代码如下: $t1 = microtime(true);// ... 执行代码 ...
- MySql连接JDBC数据库------借鉴的红客联盟的
首先安装MySQL数据库,我安装的是MySQL5.5,具体安装步骤这里就不介绍了.需要提醒的是,如果安装进程一直停在start service那里,无法继续进行下去的话,请参照我的博文<安装My ...
- bookshelf
nodejs mysql ORM 比node-mysql好用多了. bookshelf 支持restful功能,用到的时候研究下:https://www.sitepoint.com/getting-s ...
- 百度ECHARTS 饼图使用心得 处理data属性
做过CRM系统的童鞋应该都或多或少接触过hicharts或者echarts等数据统计插件.用过这两款,个人感觉echarts的画面更好看.至于功能,只有适合自己的才是最好的. 今天来说说我使用echa ...
- Largest Rectangle in a Histogram(HDU1506)
Largest Rectangle in a Histogram HDU1506 一道DP题: 思路:http://blog.csdn.net/qiqijianglu/article/details/ ...
- DNS主从服务,子域授权,view视图,日志系统,压力测试
DNS主从服务,子域授权,view视图,日志系统,压力测试 DNS性能测试工具queryperfDNS查询过程: DNS主从建立: 环境: 主服务器:10.140.165.93 从服务器:10.140 ...
- JAVA的JNI调用
由于JNI调用C和调用C++差不多,而且C++中可以混合写C代码,所以这里主要是写关于JNI调用C++的部分. 一般步骤: 先是写普通的Java类,其中包括本地方法调用. 然后编译这个Java类,调 ...
- js页面刷新、前进、后退
1.使用按钮 <input type=button value=刷新 onclick="window.location.reload()"> <input typ ...
- JQuery中动态生成元素的绑定事件(坑死宝宝了)
今天在做项目的时候,遇到了一个前端的问题,坑了我好长时间没有解决,今天就记录于此,也分享给大家. 问题是这样的,首先看看我的界面,有一个初始印象: 下面是操作列所对应的JS代码: { "da ...
- 作业七:团队项目——Alpha版本冲刺阶段-05
昨天进展:代码编写. 今天安排:代码编写.