Opencv透视变换——cv::getPerspectiveTransform()与cv::warpPerspective()详解
透视变换(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
转载自:https://blog.csdn.net/guduruyu/article/details/72518340
Opencv透视变换——cv::getPerspectiveTransform()与cv::warpPerspective()详解相关推荐
- 海康工业相机SDK + OpenCV实例(4):相机参数设置详解
海康工业相机SDK + OpenCV实例(4): 相机参数设置详解 文章目录 海康工业相机SDK + OpenCV实例(4): 相机参数设置详解 前言 一.相机参数基本接口 二.自动曝光时间调整亮度 ...
- OpenCV实战(12)——图像滤波详解
OpenCV实战(12)--图像滤波详解 0. 前言 1. 频域分析 2. 低通滤波器 3. 图像下采样 3.1 使用低通滤波器下采样图像 3.2 内插像素值 4. 中值滤波器 5. 完整代码 小结 ...
- OpenCV实战(10)——积分图像详解
OpenCV实战(10)--积分图像详解 0. 前言 1. 积分图像计算 2. 自适应阈值 2.1 固定阈值的缺陷 2.2 使用自适应阈值 2.3 其它自适应阈值计算方法 2.4 完整代码 3. 使用 ...
- python人脸识别opencv_Python基于Opencv来快速实现人脸识别过程详解(完整版)
前言 随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数开始走进这个奥妙的世界. 首先看一下本实验需要的数据集,为 ...
- OpenCV实战(15)——轮廓检测详解
OpenCV实战(15)--轮廓检测详解 0. 前言 1. 提取区域轮廓 1.1 轮廓提取 1.2 复杂轮廓分析 2. 计算区域形状描述符 2.1 四边形检测 3. 完整代码 小结 系列链接 0. 前 ...
- 【OpenCV3】透视变换——cv::getPerspectiveTransform()与cv::warpPerspective()详解
透视变换(Perspective Transformation)是将成像投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping).如图1,通过透视变换 ...
- opencv透视变换:GetPerspectiveTransform、warpPerspective函数的使用
透视变换在图像还原的上的应用很广泛,他是将成像投影到一个新的视平面.比如两个摄像头在不同的角度对统一物体进行拍照,物体上的同一个点在两张照片上的坐标是不一样的,为了实现两张图片同一个点的对应关系映射, ...
- OpenCV-Python投影透视变换函数getPerspectiveTransform及warpPerspective详解
☞ ░ 老猿Python博文目录:https://blog.csdn.net/LaoYuanPython ░ 一.getPerspectiveTransform 函数 getPerspectiveTr ...
- OpenCV 畸变校正函数undistortPoints()与remap()详解及校正效果对比
一.概述 前面写过一篇博客–"疑问:undistortPoints()与remap()畸变校正后,结果相差很大",博客中对比了OpenCV中自带畸变校正函数undistortPoi ...
最新文章
- 关于DWG文件转换成PDF
- 基于深度学习的目标检测算法综述(从R-CNN到Mask R-CNN)
- linux上使用FTP下载文件
- 没用过.gitignore还敢自称高级开发?
- xp系统目前禁用索引服务器,WinXP系统中可以被禁用的服务对照表
- 前端学习(3250):一个简单的文件
- matlab 轴gui,MatlabüGUI学习笔记(4)——公共对象属性的轴,MatlabGUI,四,常用,之,Axes...
- 【简短】Autodesk宣布支持Windows 7
- 字符串(后缀自动机):COGS 2399. 循环同构
- 【联想拯救者R7000】安装nvidia驱动Perform MOK management 界面键盘失灵现象(已解决)
- mysql启动6002错误_Oracle ORA-00600 6002错误的解决方法
- 中小企业信息网络安全解决方案
- 音频音乐与计算机的交融pdf,电脑音乐的研和应用.pdf
- MonoJSG:联合语义和几何代价函数的单目3D目标检测(CVPR2022)
- 小岚rabbit_radish(兔仔-萝卜)
- bazel 链接第三方动态库_谷歌携手OPPO共同开发CameraX技术,第三方拍照应用有福了...
- java制作手机投射电脑_将Android手机投影到Win10计算机的最简单教程
- 关于Linux系统重启过慢问题解决方案
- 【Java-数据类型】
- 用Windows电脑看txt小说,阅读器软件怎么选
热门文章
- DataGuard常用命令及DG主备库开关顺序
- linux中如何让vim永久显示行号(永久显示+临时显示)
- 五种编程语言解释数据结构与算法——顺序表3(JavaScript与Python语言实现)
- C#LeetCode刷题之#191-位1的个数(Number of 1 Bits)
- JavaScript高阶函数快速入门
- 包含贴息时如何重算还款计划
- mac开发配置手册(全)
- ASP.NET中使用JSON方便实现前台与后台的数据交换
- Team Foundation Server 2010 安装、部署与配置(六):创建 Team Project .
- C#中关于updatePanel与freeTextBox不兼容的问题 当页面刷子新后,ftb不能输入内容的解决办法