OpenCV-C++实现单应性矩阵的求解
1. 单应性矩阵的理解
1.1 图像层面
单应性矩阵(Homography)约束了同一3D空间点在两个像素平面的2D齐次坐标。
单应性矩阵具有8个自由度,已知A和B两张图像上的四对点,即可列出八个方程来求解出单应性矩阵。
1.2 三维层面
单应性矩阵(Homography)可以理解为描述物体在世界坐标系和像素坐标系之间的位置映射关系。
以棋盘格相对位姿估计为例,世界坐标系定在棋盘格上,即z=0。因此世界坐标系和像素坐标系之间的关系如下:
因此,即为成像平面与标定板平面之间的单应性矩阵。其中,为相机内参矩阵,是任意尺度的比例(目的是使得单应性定义到该尺度比例)。
2. 单应性矩阵的自由度及求解思路
首先抛出结论:单应性矩阵具有8个自由度,需要4对点求解。
首先,我们假设两张图像中的对应点对齐次坐标为(x',y',1)和(x,y,1),则有:
矩阵展开后有3个等式,将第3个等式代入前两个等式中可得:
也就是说,一个点对对应两个等式。
由于这里使用的是齐次坐标系,也就是说可以进行任意尺度的缩放。比如我们把乘以任意一个非零常数并不改变等式结果,所以实际上单应矩阵只有8个自由度。8自由度下计算过程有两种方法。
第一种方法:直接设置
第二种方法:将添加约束条件,将矩阵模变为1
接下来由四个对应点的像素列出8个方程,根据最优化的方法(此处略)可以求解出结果。
3. 求解单应性矩阵及对图像进行单应性变换的方法
3.1 获得输入与输出图像
首先随意拍摄一张图片(3072×4096),命名为src.jpg:
目的是要将书本校正,因此先使用图像处理软件(如全能扫描王,华为自带相册等)获得校正后的图像(2070×2500),命名为dst.jpg:
3.2 四对点像素坐标的获取
使用Photoshop已经预先获取了src.jpg中书本四个角对应的像素点:
左上:(889,1032)
右上:(2471,1079)
左下:(276,2868)
右下:(2829,2979)
注意:x轴方向是水平向右,y轴方向是水平向下,坐标原点是图像左上角第一个像素点。
另外,也可使用图像分隔等方法检测目标物体的四个特征点。由于不是本篇文章的重点,这里不作详细说明。
dst.jpg中四个角对应的像素点即图像四个角的像素坐标:
左上:(0,0)
右上:(2069,0)
左下:(0,2499)
右下:(2069,2499)
3.3 C++实现
主要函数:findHomography与warpPerspective
C++实现代码如下:
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>using namespace cv;
using namespace std;Mat myResize(Mat &srcImag, double width_ratio, double height_ratio);int main()
{Mat im_src,im_dst,im_out,H;im_src=imread("../src.jpg");im_dst=imread("../dst.jpg");Size size=im_dst.size();//根据源图片和目标图片相对于的四对点(左上,右上,左下,右下)来计算单应性矩阵vector<Point2f> pts_src{Point2f(889,1032),Point2f(2471,1079),Point2f(276,2868),Point2f(2829,2979)};vector<Point2f> pts_dst{Point2f(0,0),Point2f(2069,0),Point2f(0,2499),Point2f(2069,2499)};//计算单应性矩阵HH = findHomography(pts_src,pts_dst);cout<< H << endl;//根据计算出来的单应性矩阵H,对图像进行透视变换warpPerspective(im_src, im_out, H, size);//将输出图片按0.3的比例缩小im_out=myResize(im_out, 0.3, 0.3);imshow("result", im_out);waitKey();destroyAllWindows();return 0;
}//调整图片大小
Mat myResize(Mat &srcImag, double width_ratio, double height_ratio)
{Mat src=srcImag;float scaleW = width_ratio;float scaleH = height_ratio;int width = int(src.cols * scaleW);int height = int(src.rows * scaleH);resize(src, src, Size(width, height));return src;
}
3.4 结果展示
计算出的单应性矩阵如下:
对src.jpg进行单应性变换的结果如下:
结果与dst.jpg基本一致,由此证明过程无误。
OpenCV-C++实现单应性矩阵的求解相关推荐
- 单应性矩阵的求解过程及应用
http://www.sohu.com/a/223594989_100007727 前面文章<从零开始学习「张氏相机标定法」(一)成像几何模型>中我们已经得到了像素坐标系和世界坐标系下的坐 ...
- 【RANSAC与单应性矩阵H求解】
特征点匹配--使用基础矩阵.单应性矩阵的RANSAC算法去除误匹配点对 RANSAC算法的单应性矩阵讲解
- opencv求两张图像光流_OpenCV单应性矩阵发现参数估算方法详解
点击上方蓝字关注我们 微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识 单应性矩阵计算函数与应用 OpenCV在通过特征描述子完成描述子匹配之后,会得到一些关键点对,我们会把这些关键 ...
- 透视变换 单应性矩阵怎么求 matlab,单应性(homography)变换的推导
矩阵的一个重要作用是将空间中的点变换到另一个空间中.这个作用在国内的<线性代数>教学中基本没有介绍.要能形像地理解这一作用,比较直观的方法就是图像变换,图像变换的方法很多,单应性变换是其中 ...
- 单应性矩阵的理解及求解4
https://blog.csdn.net/hudaliquan/article/details/52121832 网上有很多关于单应性矩阵的求解方法,但都没有说明怎样用四点求解单应性矩阵或者源码详细 ...
- 单应性矩阵 matlab,四点求解单应性矩阵
网上有很多关于单应性矩阵的求解方法,但都没有说明怎样用四点求解单应性矩阵或者源码详细说明很少.这里说说自己的理解. 首先贴出matlab代码 % 返回值 H 是一个3*3的矩阵 % pts1 和 pt ...
- OpenCV学习:仿射变换+投射变换+单应性矩阵
OpenCV学习:仿射变换+投射变换+单应性矩阵 estimateRigidTransform():计算多个二维点对或者图像之间的最优仿射变换矩阵 (2行x3列),H可以是部分自由度,比如各向一致的切 ...
- 相机标定-opencv单应性矩阵实现平面坐标标定(kinect v1)
opencv单应性矩阵实现平面坐标标定 说明 一.使用单应性矩阵的原因 二.标定原理 三.findHomography 函数与 getPerspectiveTransform函数的区别 1.两者联系 ...
- 在OpenCV中使用单应性进行姿势估计
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 什么是单应性 单应性是一种平面关系,可将点从一个平面转换为另一个平 ...
最新文章
- ESP32又有新玩法了,启明云端把它带入到冷门行业--测试治具
- Heka:Go编写,来自Mozilla,高效、灵活的插件式数据挖掘工具(转)
- 特殊类型窗体制作: 用C#实现启动欢迎界面
- 【maven】maven pom文件详解
- linux 串口 断帧,STM32f103使用串口中断发送数据时出现断帧是什么原因?
- Android 进阶技术汇总一: 个性化控件(View) 方案汇总
- Linux中如何查看Hadoop版本以及Java版本
- 最新易支付多功能系统源码+全开源
- excel提取身份证出生日期_Excel如何从身份证号码中提取年龄
- Matlab中loglog函数使用
- God‘s Perspective - God View - 上帝视角
- 全面理解ERP和APS:用饭局的例子说明,MRP 还是APS
- 编辑视频贴纸软件_3招教你搞定怎么在视频上加贴纸,剪片必备的手机App!
- 奇瑞QQ序列首款新能源汽车QQ冰淇淋上市;上海嘉定集中发展氢燃料电池和ICV | 能动...
- ThinkPad电脑(win10)总是自动休眠的解决办法,亲测有效~
- 【CTR预估】The Wide and Deep Learning Model(译文+Tensorlfow源码解析)
- BC v1.2充电规范
- golang学习笔记之string转换
- poj 1729 Jack and Jill 1376 Robot 1324 Holedox Moving 1475 Pushing Boxes bfs + a*
- WEB服务器迁移协议,web服务器迁移