透视变换(Perspective Transformation)是将成像投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。如图1,通过透视变换ABC变换到A'B'C'。

图1 透视变换示意图

透视变换的通用公式为:

变换后的坐标x,y分别为:

展开之后即:

其中,称为透视变换矩阵:表示线性变换,如scaling,shearing和ratotion等;

用于平移,因此此前介绍的仿射变换可以视作一种特殊的透视变换。

如图2,我们想将倾斜视角拍摄到的道路图像转换成鸟瞰图,即将摄像机的视角转换到和道路平行。

图2 倾斜视角

首先,我们需要获得此次透视变换的变换矩阵,opencv2和opencv3中用于计算透视变换矩阵的函数是cv::getPerspectiveTransform(),C++接口其调用形式如下:

 cv::Mat cv::getPerspectiveTransform( // 返回3x3透视变换矩阵const cv::Point2f* src, // 源图像四个顶点坐标(点数组)const cv::Point2f* dst // 目标图像上四个顶点的坐标(点数组));

如图3 ,我们选取道路上的两条平行分界线上的四个点A(165, 270)、C(360, 125)、D(615, 125)、B(835, 270),对应于鸟瞰图上的点则分别为A(165, 270)、C'(165, 30)、D'(835, 30)、B(835, 270)。

图3 透视变换端点

通过这四对点我们即可计算出透视变换矩阵M。

C++代码如下:

cv::Mat get_perspective_mat()
{cv::Point2f src_points[] = { cv::Point2f(165, 270),cv::Point2f(835, 270),cv::Point2f(360, 125),cv::Point2f(615, 125) };cv::Point2f dst_points[] = {cv::Point2f(165, 270),cv::Point2f(835, 270),cv::Point2f(165, 30),cv::Point2f(835, 30) };cv::Mat M = cv::getPerspectiveTransform(src_points, dst_points);return M;}

Python代码如下:

def get_perspective_mat():src_points = np.array([[165., 270.], [835., 270.], [360., 125.], [615., 125.]], dtype = "float32")dst_points = np.array([[165., 270.], [835., 270.], [165., 30.], [835., 30.]], dtype = "float32")M = cv2.getPerspectiveTransform(src_points, dst_points)return M

计算结果如下:

在获得透视变换矩阵后,即可使用与cv::warpPerspective()进行透视变换,其调用形式如下:

 void cv::warpPerspective(cv::InputArray src, // 输入图像cv::OutputArray dst, // 输出图像cv::InputArray M, // 3x3 变换矩阵cv::Size dsize, // 目标图像大小int flags = cv::INTER_LINEAR, // 插值方法int borderMode = cv::BORDER_CONSTANT, // 外推方法const cv::Scalar& borderValue = cv::Scalar() //常量边界时使用);

C++代码如下:

 cv::Mat perspective;cv::warpPerspective(image, perspective, M, cv::Size(960, 270), cv::INTER_LINEAR);

Python代码如下:

    perspective = cv2.warpPerspective(image, M, (960, 270), cv2.INTER_LINEAR)

变换结果如下:

2017.05.19

【OpenCV3】透视变换——cv::getPerspectiveTransform()与cv::warpPerspective()详解相关推荐

  1. Opencv透视变换——cv::getPerspectiveTransform()与cv::warpPerspective()详解

    透视变换(Perspective Transformation)是将成像投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping).如图1,通过透视变换 ...

  2. OpenCV-Python投影透视变换函数getPerspectiveTransform及warpPerspective详解

    ☞ ░ 老猿Python博文目录:https://blog.csdn.net/LaoYuanPython ░ 一.getPerspectiveTransform 函数 getPerspectiveTr ...

  3. 【OpenCV3】cv::Mat类成员函数详解

    cv::Mat为OpenCV2和OpenCV3中最重要的类,可以毫不夸张得说,掌握了cv::Mat的操作,就掌握了OpenCV大半,这里将详细的介绍下cv::Mat类的成员函数及其使用. 1.clon ...

  4. Harris角点检测原理详解(转载)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lwzkiller/article/details/54633670 关于角点的应用在图像处理上比较广 ...

  5. opencv-python 详解直方图均衡(二)《再详细介绍直方图以及OpenCV中提供的函数使用》

    作者:RayChiu_Labloy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 目录 传送门: 详解直方图均衡(一)<图像增强.灰度变换和直方图均衡化关系> ...

  6. 【OpenCV3】棋盘格角点检测与绘制——cv::findChessboardCorners()与cv::drawChessboardCorners()详解

    棋盘格法是摄像机标定中常用的一种方法,在使用该方法时需要对棋盘格的角点进行检测.opencv中封装了一个专门用于棋盘格角点检测的函数即cv::findChessboardCorners(),同时,也提 ...

  7. 【OpenCV3】模板匹配——cv::matchTemplate()详解

    模板匹配通常被用于目标检测.相似度分析中,opencv2和opencv3中提供了一个专门用于模板匹配的函数--cv::matchTemplate(),下面就对该函数进行详细的介绍. 先从一个实际的例子 ...

  8. 【OpenCV3】图像通道分离与合并——cv::split()与cv::merge()详解

    在图像处理中,尤其是处理多通道图像时,有时需要对各个通道进行分离,分别处理:有时还需要对分离处理后的各个通道进行合并,重新合并成一个多通道的图像.opencv2和opencv3中实现图像通道的合并与分 ...

  9. 【OpenCV3】图像旋转与平移——cv::warpAffine()详解

    图像旋转和平移是图像处理中常用的一种操作,opencv2和opencv3中对图像的旋转和平移都是通过仿射变换函数cv::warpAffine()来实现的. 1.图像的旋转 图像的旋转具体实现分为两步: ...

最新文章

  1. 如何在Gihub上面精准搜索开源项目?
  2. 科技议题“破圈”有利还是有弊|观点
  3. Crawling - Computing Ranking 很长时间, 怎么办?
  4. 成功解决from scipy.misc import imread, imresize ImportError: cannot import name ‘imread‘
  5. 汇编语言——100个数中的最大数
  6. f60gen command
  7. Spring中ApplicationContext加载机制
  8. 19年8月 字母哥 第三章 spring boot 配置原理实战 用热点公司网不行
  9. weex eros框架源码解析
  10. 亲历!不要痴迷蓝牙耳机了,出门选这个准没错,99W+人的选择
  11. windows server2008 IIS搭建网站简易教程(阿里云)
  12. Cyrus SASL Libary学习
  13. 为什么总说程序员是吃青春饭的? 32岁程序员直接被面试官送走?
  14. 虚拟机安装CentOS6.5报错:Hardware Unsupported detected问题的解决
  15. LTE-5G学习笔记17--COMP技术讲解
  16. ambarella misc
  17. 《雪鹰领主3D》昨日腾讯玩吧首发! HTML5进入3D游戏时代!
  18. linux命令如何查看dns,linux查看dns命令
  19. SYBASE 12.5 维护手册 3. 技术专刊
  20. 如何成为一名架构师,架构师成长之路

热门文章

  1. java time 周期性执行,详解ScheduledExecutorService的周期性执行方法
  2. Modular Arithmetic 模算术
  3. 高并发编程-happens-before
  4. Spring Boot2.x-05Spring Boot基础-使用注解完成依赖注入
  5. Spring JDBC-混合框架的事务管理
  6. java动态规划凑硬币问题,详解动态规划最少硬币找零问题--JavaScript实现
  7. 机器学习:论相关(一)
  8. html load方法的区别,jQuery  中的.load()、$get()、$,post()用法和区别
  9. 基于Smith预估器的PID控制在房间湿度控制
  10. SpringBoot静态资源的映射