透视变换(单应性?)能提供更大的灵活性,但是一个透视投影并不是线性变换,因此所采用的映射矩阵是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.

  1. #include
  2. #include
  3. int main(int argc, char** argv)
  4. {
  5. CvPoint2D32f srcTri[4], dstTri[4]; //二维坐标下的点,类型为浮点
  6. //CvMat* rot_mat = cvCreateMat( 2, 3, CV_32FC1 );  //多通道矩阵
  7. CvMat* warp_mat = cvCreateMat( 3, 3, CV_32FC1 );
  8. IplImage *src, *dst;
  9. if( argc == 2 && ( ( src = cvLoadImage( argv[1], 1 ) ) != 0 ) )
  10. {
  11. dst = cvCloneImage( src );  //制作图像的完整拷贝
  12. dst ->origin = src ->origin;
  13. cvZero( dst );  //清空数组
  14. //计算矩阵仿射变换
  15. srcTri[0].x = 0;
  16. srcTri[0].y = 0;
  17. srcTri[1].x = src -> width - 1;  //缩小一个像素
  18. srcTri[1].y = 0;
  19. srcTri[2].x = 0;
  20. srcTri[2].y = src -> height - 1;
  21. srcTri[3].x = src -> width - 1;  //bot right
  22. srcTri[3].y = src -> height - 1;
  23. //改变目标图像大小
  24. dstTri[0].x = src -> width * 0.05;
  25. dstTri[0].y = src -> height * 0.33;
  26. dstTri[1].x = src -> width * 0.9;
  27. dstTri[1].y = src -> height * 0.25;
  28. dstTri[2].x = src -> width * 0.2;
  29. dstTri[2].y = src -> height * 0.7;
  30. dstTri[3].x = src -> width * 0.8;
  31. dstTri[3].y = src -> height * 0.9;
  32. cvGetPerspectiveTransform( srcTri, dstTri, warp_mat );  //由三对点计算仿射变换
  33. cvWarpPerspective( src, dst, warp_mat );  //对图像做仿射变换
  34. //输出
  35. cvNamedWindow( "Perspective Warp", 1 );
  36. cvShowImage( "Perspective Warp", dst );  //最终是输出dst
  37. cvWaitKey();
  38. }
  39. cvReleaseImage( &dst );
  40. cvReleaseMat( &warp_mat );
  41. return 0;
  42. }

透视变换(单应性?)能提供更大的灵活性,但是一个透视投影并不是线性变换,因此所采用的映射矩阵是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.

  1. #include
  2. #include
  3. int main(int argc, char** argv)
  4. {
  5. CvPoint2D32f srcTri[4], dstTri[4]; //二维坐标下的点,类型为浮点
  6. //CvMat* rot_mat = cvCreateMat( 2, 3, CV_32FC1 );  //多通道矩阵
  7. CvMat* warp_mat = cvCreateMat( 3, 3, CV_32FC1 );
  8. IplImage *src, *dst;
  9. if( argc == 2 && ( ( src = cvLoadImage( argv[1], 1 ) ) != 0 ) )
  10. {
  11. dst = cvCloneImage( src );  //制作图像的完整拷贝
  12. dst ->origin = src ->origin;
  13. cvZero( dst );  //清空数组
  14. //计算矩阵仿射变换
  15. srcTri[0].x = 0;
  16. srcTri[0].y = 0;
  17. srcTri[1].x = src -> width - 1;  //缩小一个像素
  18. srcTri[1].y = 0;
  19. srcTri[2].x = 0;
  20. srcTri[2].y = src -> height - 1;
  21. srcTri[3].x = src -> width - 1;  //bot right
  22. srcTri[3].y = src -> height - 1;
  23. //改变目标图像大小
  24. dstTri[0].x = src -> width * 0.05;
  25. dstTri[0].y = src -> height * 0.33;
  26. dstTri[1].x = src -> width * 0.9;
  27. dstTri[1].y = src -> height * 0.25;
  28. dstTri[2].x = src -> width * 0.2;
  29. dstTri[2].y = src -> height * 0.7;
  30. dstTri[3].x = src -> width * 0.8;
  31. dstTri[3].y = src -> height * 0.9;
  32. cvGetPerspectiveTransform( srcTri, dstTri, warp_mat );  //由三对点计算仿射变换
  33. cvWarpPerspective( src, dst, warp_mat );  //对图像做仿射变换
  34. //输出
  35. cvNamedWindow( "Perspective Warp", 1 );
  36. cvShowImage( "Perspective Warp", dst );  //最终是输出dst
  37. cvWaitKey();
  38. }
  39. cvReleaseImage( &dst );
  40. cvReleaseMat( &warp_mat );
  41. return 0;
  42. }

opencv之透视变换cvWarpPerspective相关推荐

  1. 文档扫描仪的构建——使用Python,OpenCV应用透视变换来获得图像的自顶向下的“鸟瞰图”

    使用Python,OpenCV应用透视变换来获得图像的自顶向下的"鸟瞰图" 1. 效果图 2. 应用透视变换的步骤 3. 优化:矩形角点的获取 4. 源码 参考 这篇博客演示了如何 ...

  2. OpenCV:透视变换

    一.话说透视变换 透视变换是将图像从一个视平面投影到另外一个视平面的过程,所以透视变换也被称为投影映射(Projection Mapping).我们知道在图像的仿射变换中需要变换矩阵是一个2x3的两维 ...

  3. 【Python+OpenCV 图像透视变换 warpPerspective函数】

    Python+OpenCV 图像透视变换 warpPerspective函数 1.函数介绍 2.代码实例 3.实现效果 1.函数介绍 warpPerspective():对图像进行透视变换.简单来说, ...

  4. python opencv 实现透视变换——将侧视图进行正投影

    python opencv 实现透视变换--将侧视图进行正投影 这个方法可以将倾斜拍摄的四边形图片投影成矩形,在图像处理工程里经常要用,之前写过一个C语言版本的,可以搜我博客:透视变换 但是pytho ...

  5. 【OpenCV】透视变换 Perspective Transformation(续)

    透视变换的原理和矩阵求解请参见前一篇<透视变换 Perspective Transformation>.在OpenCV中也实现了透视变换的公式求解和变换函数. 求解变换公式的函数: [cp ...

  6. 【OpenCV】透视变换 Perspective Transformation

    透视变换的原理和矩阵求解请参见前一篇<透视变换 Perspective Transformation>.在OpenCV中也实现了透视变换的公式求解和变换函数. 求解变换公式的函数: Mat ...

  7. 使用opencv的透视变换裁剪倾斜人脸

    需求 人脸检测以后,有了检测框,需要将眼睛扶正,并裁剪,然后resize成需要的大小. 人脸检测结果如下: 其中蓝色是检测框,内部的红色框是我根据长宽扩展的正方形,绿色框是根据眼睛倾斜角度计算的正方形 ...

  8. 基于opencv实现透视变换(Python)

    透视变换 文章目录 透视变换 1.导入opencv等相关库,并封装一个显示图像的函数,方便后面显示图像 2.读取图片 3.设置输出图片的宽高 4.设置透视变换前后顶点位置✨✨✨ 5.调用opencv中 ...

  9. OPenCV 图像透视变换矫正

    图像透视变换矫正 Fu Xianjun. All Rights Reserved. 文章目录 前言 一.图像透视变换矫正是什么? 二.使用步骤 1.引入库 2.读入数据 总结 前言 随着人工智能的不断 ...

  10. 【OpenCV】透视变换应用——实现鸟瞰图与贴图

    透视变换是3D转换,透视变换的本质是将图像投影到一个新的视平面: 据此,我们可以使用透视变化来实现鸟瞰图和图形贴图的效果: 一.鸟瞰图 实现前: 实现效果: 1.准备一个空的mat对象 用于保存转换后 ...

最新文章

  1. LeetCode简单题之圆形赛道上经过次数最多的扇区
  2. 螳螂捕蝉黄雀在后!地下黑客论坛免费远控木马被曝“后门”
  3. 中小企业远程存储服务之利弊
  4. 【Win32汇编】字符串逆序
  5. java服务器内存问题_java内存泄漏5种情况总结
  6. Android Material风格的应用(三)--DrawerLayout
  7. 在html中写js提示错误,页面HTML标签优化
  8. 新媒体配图不愁,超优质图片素材--素材路上!
  9. post and get
  10. Java中对象的直接赋值、浅拷贝及深拷贝的理解和应用场景及其实现方式
  11. nginx 逻辑运算
  12. 吴恩达深度学习课程——神经网络与深度学习
  13. excel数据解析内存占用优化
  14. windows 技巧篇-解除共享文件夹占用方法,解决共享文件被占用导致不可修改问题,查看共享文件被谁占用方法
  15. CISCO 交换设备IOS 备份/恢复操作
  16. 微信小程序开发工具取消用户授权
  17. Web客户端语言HTML、XHTML和XML相关知识介绍
  18. 从零开始创建自己的区块链应用(JAVA版)
  19. 从站寄存器EEPROM内容解析之SII(Slave Information Interface)
  20. 【Linux】在Windows 10环境下安装适用于 Linux 的子系统 (WSL安装指南)

热门文章

  1. vue脚手架学习笔记
  2. lscpu 显示cpu的相关信息
  3. oracle游标作为out参数,oracle 存储过程 带游标作为OUT参数输出
  4. c 中regex_match的用法_内联函数 —— C 中关键字 inline 用法解析
  5. asp if 显示按钮_ASP.NET Core 3.1入门教程(二)
  6. Filter过滤器概念及生命周期
  7. java事件监听机制 概述
  8. python二维数据读取对齐_[Python ] Python 多维数组转换的维度对齐问题
  9. 可做fft分析吗_做数据分析的你,真的会5W2H分析法吗?
  10. LLVM语言参考手册之标识符、类型与常量