opencv之透视变换cvWarpPerspective
透视变换(单应性?)能提供更大的灵活性,但是一个透视投影并不是线性变换,因此所采用的映射矩阵是3*3,且控点变为4个,其他方面与仿射变换完全类似,下面的例程是针对密集变换,稀疏图像变换则采用cvPerspectiveTransform函数来处理。
------------------------------------------------------------------------------------------------
WarpPerspective
对图像进行透视变换
void cvWarpPerspective( const CvArr* src, CvArr* dst,constCvMat* 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, constCvPoint2D32f* 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.
- #include
- #include
- 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;
- 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;
- }
透视变换(单应性?)能提供更大的灵活性,但是一个透视投影并不是线性变换,因此所采用的映射矩阵是3*3,且控点变为4个,其他方面与仿射变换完全类似,下面的例程是针对密集变换,稀疏图像变换则采用cvPerspectiveTransform函数来处理。
------------------------------------------------------------------------------------------------
WarpPerspective
对图像进行透视变换
void cvWarpPerspective( const CvArr* src, CvArr* dst,constCvMat* 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, constCvPoint2D32f* 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.
- #include
- #include
- 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;
- 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;
- }
opencv之透视变换cvWarpPerspective相关推荐
- 文档扫描仪的构建——使用Python,OpenCV应用透视变换来获得图像的自顶向下的“鸟瞰图”
使用Python,OpenCV应用透视变换来获得图像的自顶向下的"鸟瞰图" 1. 效果图 2. 应用透视变换的步骤 3. 优化:矩形角点的获取 4. 源码 参考 这篇博客演示了如何 ...
- OpenCV:透视变换
一.话说透视变换 透视变换是将图像从一个视平面投影到另外一个视平面的过程,所以透视变换也被称为投影映射(Projection Mapping).我们知道在图像的仿射变换中需要变换矩阵是一个2x3的两维 ...
- 【Python+OpenCV 图像透视变换 warpPerspective函数】
Python+OpenCV 图像透视变换 warpPerspective函数 1.函数介绍 2.代码实例 3.实现效果 1.函数介绍 warpPerspective():对图像进行透视变换.简单来说, ...
- python opencv 实现透视变换——将侧视图进行正投影
python opencv 实现透视变换--将侧视图进行正投影 这个方法可以将倾斜拍摄的四边形图片投影成矩形,在图像处理工程里经常要用,之前写过一个C语言版本的,可以搜我博客:透视变换 但是pytho ...
- 【OpenCV】透视变换 Perspective Transformation(续)
透视变换的原理和矩阵求解请参见前一篇<透视变换 Perspective Transformation>.在OpenCV中也实现了透视变换的公式求解和变换函数. 求解变换公式的函数: [cp ...
- 【OpenCV】透视变换 Perspective Transformation
透视变换的原理和矩阵求解请参见前一篇<透视变换 Perspective Transformation>.在OpenCV中也实现了透视变换的公式求解和变换函数. 求解变换公式的函数: Mat ...
- 使用opencv的透视变换裁剪倾斜人脸
需求 人脸检测以后,有了检测框,需要将眼睛扶正,并裁剪,然后resize成需要的大小. 人脸检测结果如下: 其中蓝色是检测框,内部的红色框是我根据长宽扩展的正方形,绿色框是根据眼睛倾斜角度计算的正方形 ...
- 基于opencv实现透视变换(Python)
透视变换 文章目录 透视变换 1.导入opencv等相关库,并封装一个显示图像的函数,方便后面显示图像 2.读取图片 3.设置输出图片的宽高 4.设置透视变换前后顶点位置✨✨✨ 5.调用opencv中 ...
- OPenCV 图像透视变换矫正
图像透视变换矫正 Fu Xianjun. All Rights Reserved. 文章目录 前言 一.图像透视变换矫正是什么? 二.使用步骤 1.引入库 2.读入数据 总结 前言 随着人工智能的不断 ...
- 【OpenCV】透视变换应用——实现鸟瞰图与贴图
透视变换是3D转换,透视变换的本质是将图像投影到一个新的视平面: 据此,我们可以使用透视变化来实现鸟瞰图和图形贴图的效果: 一.鸟瞰图 实现前: 实现效果: 1.准备一个空的mat对象 用于保存转换后 ...
最新文章
- LeetCode简单题之圆形赛道上经过次数最多的扇区
- 螳螂捕蝉黄雀在后!地下黑客论坛免费远控木马被曝“后门”
- 中小企业远程存储服务之利弊
- 【Win32汇编】字符串逆序
- java服务器内存问题_java内存泄漏5种情况总结
- Android Material风格的应用(三)--DrawerLayout
- 在html中写js提示错误,页面HTML标签优化
- 新媒体配图不愁,超优质图片素材--素材路上!
- post and get
- Java中对象的直接赋值、浅拷贝及深拷贝的理解和应用场景及其实现方式
- nginx 逻辑运算
- 吴恩达深度学习课程——神经网络与深度学习
- excel数据解析内存占用优化
- windows 技巧篇-解除共享文件夹占用方法,解决共享文件被占用导致不可修改问题,查看共享文件被谁占用方法
- CISCO 交换设备IOS 备份/恢复操作
- 微信小程序开发工具取消用户授权
- Web客户端语言HTML、XHTML和XML相关知识介绍
- 从零开始创建自己的区块链应用(JAVA版)
- 从站寄存器EEPROM内容解析之SII(Slave Information Interface)
- 【Linux】在Windows 10环境下安装适用于 Linux 的子系统 (WSL安装指南)
热门文章
- vue脚手架学习笔记
- lscpu 显示cpu的相关信息
- oracle游标作为out参数,oracle 存储过程 带游标作为OUT参数输出
- c 中regex_match的用法_内联函数 —— C 中关键字 inline 用法解析
- asp if 显示按钮_ASP.NET Core 3.1入门教程(二)
- Filter过滤器概念及生命周期
- java事件监听机制 概述
- python二维数据读取对齐_[Python ] Python 多维数组转换的维度对齐问题
- 可做fft分析吗_做数据分析的你,真的会5W2H分析法吗?
- LLVM语言参考手册之标识符、类型与常量