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

图1 透视变换示意图

透视变换的通用公式为:

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

展开之后即:

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

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

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

图2 倾斜视角

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

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

如图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++代码如下:

  1. cv::Mat get_perspective_mat()
  2. {
  3. cv::Point2f src_points[] = {
  4. cv::Point2f(165, 270),
  5. cv::Point2f(835, 270),
  6. cv::Point2f(360, 125),
  7. cv::Point2f(615, 125) };
  8. cv::Point2f dst_points[] = {
  9. cv::Point2f(165, 270),
  10. cv::Point2f(835, 270),
  11. cv::Point2f(165, 30),
  12. cv::Point2f(835, 30) };
  13. cv::Mat M = cv::getPerspectiveTransform(src_points, dst_points);
  14. return M;
  15. }

Python代码如下:

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

计算结果如下:

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

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

C++代码如下:

  1. cv::Mat perspective;
  2. 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

转载自:https://blog.csdn.net/guduruyu/article/details/72518340

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

  1. 海康工业相机SDK + OpenCV实例(4):相机参数设置详解

    海康工业相机SDK + OpenCV实例(4): 相机参数设置详解 文章目录 海康工业相机SDK + OpenCV实例(4): 相机参数设置详解 前言 一.相机参数基本接口 二.自动曝光时间调整亮度 ...

  2. OpenCV实战(12)——图像滤波详解

    OpenCV实战(12)--图像滤波详解 0. 前言 1. 频域分析 2. 低通滤波器 3. 图像下采样 3.1 使用低通滤波器下采样图像 3.2 内插像素值 4. 中值滤波器 5. 完整代码 小结 ...

  3. OpenCV实战(10)——积分图像详解

    OpenCV实战(10)--积分图像详解 0. 前言 1. 积分图像计算 2. 自适应阈值 2.1 固定阈值的缺陷 2.2 使用自适应阈值 2.3 其它自适应阈值计算方法 2.4 完整代码 3. 使用 ...

  4. python人脸识别opencv_Python基于Opencv来快速实现人脸识别过程详解(完整版)

    前言 随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数开始走进这个奥妙的世界. 首先看一下本实验需要的数据集,为 ...

  5. OpenCV实战(15)——轮廓检测详解

    OpenCV实战(15)--轮廓检测详解 0. 前言 1. 提取区域轮廓 1.1 轮廓提取 1.2 复杂轮廓分析 2. 计算区域形状描述符 2.1 四边形检测 3. 完整代码 小结 系列链接 0. 前 ...

  6. 【OpenCV3】透视变换——cv::getPerspectiveTransform()与cv::warpPerspective()详解

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

  7. opencv透视变换:GetPerspectiveTransform、warpPerspective函数的使用

    透视变换在图像还原的上的应用很广泛,他是将成像投影到一个新的视平面.比如两个摄像头在不同的角度对统一物体进行拍照,物体上的同一个点在两张照片上的坐标是不一样的,为了实现两张图片同一个点的对应关系映射, ...

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

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

  9. OpenCV 畸变校正函数undistortPoints()与remap()详解及校正效果对比

    一.概述 前面写过一篇博客–"疑问:undistortPoints()与remap()畸变校正后,结果相差很大",博客中对比了OpenCV中自带畸变校正函数undistortPoi ...

最新文章

  1. 关于DWG文件转换成PDF
  2. 基于深度学习的目标检测算法综述(从R-CNN到Mask R-CNN)
  3. linux上使用FTP下载文件
  4. 没用过.gitignore还敢自称高级开发?
  5. xp系统目前禁用索引服务器,WinXP系统中可以被禁用的服务对照表
  6. 前端学习(3250):一个简单的文件
  7. matlab 轴gui,MatlabüGUI学习笔记(4)——公共对象属性的轴,MatlabGUI,四,常用,之,Axes...
  8. 【简短】Autodesk宣布支持Windows 7
  9. 字符串(后缀自动机):COGS 2399. 循环同构
  10. 【联想拯救者R7000】安装nvidia驱动Perform MOK management 界面键盘失灵现象(已解决)
  11. mysql启动6002错误_Oracle ORA-00600 6002错误的解决方法
  12. 中小企业信息网络安全解决方案
  13. 音频音乐与计算机的交融pdf,电脑音乐的研和应用.pdf
  14. MonoJSG:联合语义和几何代价函数的单目3D目标检测(CVPR2022)
  15. 小岚rabbit_radish(兔仔-萝卜)
  16. bazel 链接第三方动态库_谷歌携手OPPO共同开发CameraX技术,第三方拍照应用有福了...
  17. java制作手机投射电脑_将Android手机投影到Win10计算机的最简单教程
  18. 关于Linux系统重启过慢问题解决方案
  19. 【Java-数据类型】
  20. 用Windows电脑看txt小说,阅读器软件怎么选

热门文章

  1. DataGuard常用命令及DG主备库开关顺序
  2. linux中如何让vim永久显示行号(永久显示+临时显示)
  3. 五种编程语言解释数据结构与算法——顺序表3(JavaScript与Python语言实现)
  4. C#LeetCode刷题之#191-位1的个数(Number of 1 Bits)
  5. JavaScript高阶函数快速入门
  6. 包含贴息时如何重算还款计划
  7. mac开发配置手册(全)
  8. ASP.NET中使用JSON方便实现前台与后台的数据交换
  9. Team Foundation Server 2010 安装、部署与配置(六):创建 Team Project .
  10. C#中关于updatePanel与freeTextBox不兼容的问题 当页面刷子新后,ftb不能输入内容的解决办法