【OpenCV3】透视变换——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
【OpenCV3】透视变换——cv::getPerspectiveTransform()与cv::warpPerspective()详解相关推荐
- Opencv透视变换——cv::getPerspectiveTransform()与cv::warpPerspective()详解
透视变换(Perspective Transformation)是将成像投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping).如图1,通过透视变换 ...
- OpenCV-Python投影透视变换函数getPerspectiveTransform及warpPerspective详解
☞ ░ 老猿Python博文目录:https://blog.csdn.net/LaoYuanPython ░ 一.getPerspectiveTransform 函数 getPerspectiveTr ...
- 【OpenCV3】cv::Mat类成员函数详解
cv::Mat为OpenCV2和OpenCV3中最重要的类,可以毫不夸张得说,掌握了cv::Mat的操作,就掌握了OpenCV大半,这里将详细的介绍下cv::Mat类的成员函数及其使用. 1.clon ...
- Harris角点检测原理详解(转载)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lwzkiller/article/details/54633670 关于角点的应用在图像处理上比较广 ...
- opencv-python 详解直方图均衡(二)《再详细介绍直方图以及OpenCV中提供的函数使用》
作者:RayChiu_Labloy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 目录 传送门: 详解直方图均衡(一)<图像增强.灰度变换和直方图均衡化关系> ...
- 【OpenCV3】棋盘格角点检测与绘制——cv::findChessboardCorners()与cv::drawChessboardCorners()详解
棋盘格法是摄像机标定中常用的一种方法,在使用该方法时需要对棋盘格的角点进行检测.opencv中封装了一个专门用于棋盘格角点检测的函数即cv::findChessboardCorners(),同时,也提 ...
- 【OpenCV3】模板匹配——cv::matchTemplate()详解
模板匹配通常被用于目标检测.相似度分析中,opencv2和opencv3中提供了一个专门用于模板匹配的函数--cv::matchTemplate(),下面就对该函数进行详细的介绍. 先从一个实际的例子 ...
- 【OpenCV3】图像通道分离与合并——cv::split()与cv::merge()详解
在图像处理中,尤其是处理多通道图像时,有时需要对各个通道进行分离,分别处理:有时还需要对分离处理后的各个通道进行合并,重新合并成一个多通道的图像.opencv2和opencv3中实现图像通道的合并与分 ...
- 【OpenCV3】图像旋转与平移——cv::warpAffine()详解
图像旋转和平移是图像处理中常用的一种操作,opencv2和opencv3中对图像的旋转和平移都是通过仿射变换函数cv::warpAffine()来实现的. 1.图像的旋转 图像的旋转具体实现分为两步: ...
最新文章
- 如何在Gihub上面精准搜索开源项目?
- 科技议题“破圈”有利还是有弊|观点
- Crawling - Computing Ranking 很长时间, 怎么办?
- 成功解决from scipy.misc import imread, imresize ImportError: cannot import name ‘imread‘
- 汇编语言——100个数中的最大数
- f60gen command
- Spring中ApplicationContext加载机制
- 19年8月 字母哥 第三章 spring boot 配置原理实战 用热点公司网不行
- weex eros框架源码解析
- 亲历!不要痴迷蓝牙耳机了,出门选这个准没错,99W+人的选择
- windows server2008 IIS搭建网站简易教程(阿里云)
- Cyrus SASL Libary学习
- 为什么总说程序员是吃青春饭的? 32岁程序员直接被面试官送走?
- 虚拟机安装CentOS6.5报错:Hardware Unsupported detected问题的解决
- LTE-5G学习笔记17--COMP技术讲解
- ambarella misc
- 《雪鹰领主3D》昨日腾讯玩吧首发! HTML5进入3D游戏时代!
- linux命令如何查看dns,linux查看dns命令
- SYBASE 12.5 维护手册 3. 技术专刊
- 如何成为一名架构师,架构师成长之路
热门文章
- java time 周期性执行,详解ScheduledExecutorService的周期性执行方法
- Modular Arithmetic 模算术
- 高并发编程-happens-before
- Spring Boot2.x-05Spring Boot基础-使用注解完成依赖注入
- Spring JDBC-混合框架的事务管理
- java动态规划凑硬币问题,详解动态规划最少硬币找零问题--JavaScript实现
- 机器学习:论相关(一)
- html load方法的区别,jQuery 中的.load()、$get()、$,post()用法和区别
- 基于Smith预估器的PID控制在房间湿度控制
- SpringBoot静态资源的映射