Homography单应性矩阵

1. Homography 单应性概念
考虑 同一个平面(比如书皮)的两张图片,红点表示同一个物理坐标点在两张图片上的各自位置。在 CV 术语中,我们称之为对应点。

Homography 就是将一张图像上的点映射到另一张图像上对应点的3x3变换矩阵.
因为 Homography 是一个 3x3 的 矩阵,所以我们可以把它写成:

H=[h11h12h13h21h22h23h31h32h33].H =\begin{bmatrix} h11&h12&h13\\ h21&h22&h23\\ h31&h32&h33\\ \end{bmatrix}. H=⎣⎡​h11h21h31​h12h22h32​h13h23h33​⎦⎤​.
对于图中的一对儿对应点,位于图一的 (x1, y1) 和 位于图二的 (x2, y2). H 把二者映射关系建立起来:
[x1y11]=[h11h12h13h21h22h23h31h32h33]∗[x2y21].\begin{bmatrix} x1\\ y1\\ 1\\ \end{bmatrix} =\begin{bmatrix} h11&h12&h13\\ h21&h22&h23\\ h31&h32&h33\\ \end{bmatrix} * \begin{bmatrix} x2\\ y2\\ 1\\ \end{bmatrix}. ⎣⎡​x1y11​⎦⎤​=⎣⎡​h11h21h31​h12h22h32​h13h23h33​⎦⎤​∗⎣⎡​x2y21​⎦⎤​.
对于所有的对应点,只要它们都位于同一个物理平面上,上述 Homography 就是成立的。换句话说,就是可以把图一中书皮上的所有点都映射到图二的书皮上,也就是看起来,图一中的书皮和图二中的书皮对齐了!
那么对于不在此平面上的点呢?这时再应用 Homography 就无法再对齐到对应点了。比如 上图中的 桌面,地面,橱柜面。对于这种图像中有多个平面的情况,我们就需要针对每一个平面使用其对应的Homography了。

2. 如何计算 Homography?
对于 H 矩阵,一般设 H22 为 1, 所以 H 有 8 个未知参数。至少需要8 个等式才能求解。而一组对应点可以提供 2 个等式,所以,至少需要 4 组对应点(任意三点不共线)来求得 H。 如果有更多组对应点,效果更佳。 OpenCV 可以鲁棒地计算出一个最好地拟合所有对应点的 Homography。通常,图像间的这些对应点通过 SIFT 或者 SURF 这样算法进行自动特征提取和匹配。当然,对于简单的demo,手动选取对应点就足够了。

//pts_src : 源图像点坐标
//pts_dst : 结果图像坐标
// 数据类型都是 vector<Point2f>.
// 需要至少4组对应点.
Mat h = findHomography(pts_src, pts_dst);//im_src : 源图像
// im_dst : 结果图像
// h: 上一步计算得到的 Homography
// size : im_dst 的 大小(宽度,高度)
// 将 im_src 通过 h warp 到 im_dst 上去
warpPerspective(im_src, im_dst, h, size);// warp points, not full image
vector<Point2f> dstPoints, srcPoints;
srcPoints.push_back(Point2f(1,1));
cv::perspectiveTransform(srcPoints,dstPoints,warpMatrix);

for example

#include "opencv2/opencv.hpp" using namespace cv;
using namespace std;int main( int argc, char** argv)
{// Read source image.Mat im_src = imread("book2.jpg");// Four corners of the book in source imagevector<Point2f> pts_src;pts_src.push_back(Point2f(141, 131));pts_src.push_back(Point2f(480, 159));pts_src.push_back(Point2f(493, 630));pts_src.push_back(Point2f(64, 601));// Read destination image.Mat im_dst = imread("book1.jpg");// Four corners of the book in destination image.vector<Point2f> pts_dst;pts_dst.push_back(Point2f(318, 256));pts_dst.push_back(Point2f(534, 372));pts_dst.push_back(Point2f(316, 670));pts_dst.push_back(Point2f(73, 473));// Calculate HomographyMat h = findHomography(pts_src, pts_dst);// Output imageMat im_out;// Warp source image to destination based on homographywarpPerspective(im_src, im_out, h, im_dst.size());// Display imagesimshow("Source Image", im_src);imshow("Destination Image", im_dst);imshow("Warped Source Image", im_out);waitKey(0);
}

3. Homography,Essential 和 Fundamental matrix

单应 ( homography )也叫射影映射,保线变换或射影变换,射影变换可以看作是一些列变换的组合:
H=Hs∗Ha∗Hp=[sRt01]∗[K001]∗[I0Vv]H = Hs * Ha *Hp = \begin{bmatrix} sR&t\\ 0&1\\ \end{bmatrix} *\begin{bmatrix} K&0\\ 0&1\\ \end{bmatrix}*\begin{bmatrix} I&0\\ V&v\\ \end{bmatrix} H=Hs∗Ha∗Hp=[sR0​t1​]∗[K0​01​]∗[IV​0v​]
其中Hs是相似变换矩阵,Ha是仿射变换矩阵,Hp也是一个射影变换矩阵。

本质矩阵(Essential matrix)是归一化图像坐标下的基本矩阵的特殊形式。其参数由运动的pose决定,与相机内参无关;本质矩阵在位姿估计和相机标定上很有用。
假设在一个图中的点x下的坐标是( u , v , 1 ) T,与其相对应匹配点x ′的坐标是( u ′ , v ′ , 1 ) T ,单应性矩阵H,则有 xTEx′=0x^T Ex' = 0xTEx′=0即
[uv1][e11e12e13e21e22e23e31e32e33][u′v′1]=0\begin{bmatrix} u&v&1\\ \end{bmatrix} \begin{bmatrix} e11&e12&e13\\ e21&e22&e23\\ e31&e32&e33\\ \end{bmatrix}\begin{bmatrix} u'\\ v'\\ 1\\ \end{bmatrix} = 0 [u​v​1​]⎣⎡​e11e21e31​e12e22e32​e13e23e33​⎦⎤​⎣⎡​u′v′1​⎦⎤​=0
因为E=tRE=t^RE=tR由于平移和旋转各3个自由度共有6个自由,但考虑到尺度等价性,故E实际上有5个自由度。求出E 后就可以采用奇异值分解(SVD)恢复出相机的运动R、t。
Fundamental matrix:对两幅图像中任何一对对应点x和x′基本矩阵(Fundamental matrix)F都满足条件:
xTFx′=0x^TFx' =0xTFx′=0
E和F关系:
F=K−TEK−1F=K^{-T}EK^{-1}F=K−TEK−1
其中K为相机内参矩阵。因为E和F差个相机内参,而SLAM中相机通常都标定过,内参已知。所以实践中常用E。

计算机视觉 -- Homography单应性矩阵相关推荐

  1. 计算机视觉学习笔记(四)homography 单应性矩阵的理解及求解

    单应性矩阵的理解及求解 1. 齐次坐标(Homogeneous Coordinate) 一幅2D图像上的非齐次坐标为(x,y),而齐次坐标为(x,y,1),也可以写成(x/z,y/z,1)或(x,y, ...

  2. Homography单应性矩阵程序实现

    单应性矩阵重要应用在求解两幅图像的映射关系,或者图像坐标与世界坐标的映射关系. 这里主要在张正有相机标定法的基础上,求解H. 具体理论为请点:相机标定法-张正有 Opencv程序实现 std::vec ...

  3. [计算机视觉] 一篇文章教你学会单应性矩阵Homography(Python/C++)

    0.国外原文链接 Homography examples using OpenCV ( Python / C ++ ) 1.什么是单应性? 考虑图中显示的平面.红点代表两个图像中的相同物理点.在计算机 ...

  4. 关于单应性矩阵的理解:Homography matrix for dummies

    尽量写的通俗一点,因为从某种程度上讲,本人也是dummy..... 1. 先说homogeneous coordinate,齐次坐标 一幅2D图像上的非齐次坐标为(x,y),而齐次坐标为(x,y,1) ...

  5. 计算机视觉教程1-2:单应性矩阵估计

    目录 1 导论 2 基本直接线性变换(Basic DLT) 3 归一化直接线性变换(Normalized DLT) 4 鲁棒单应性估计(Robust Homography Estimation) 1 ...

  6. Homography matrix(单应性矩阵)在广告投放中的实践

    原文首发于微信公众号「3D视觉工坊」. 前言 由于近期在研究相机与投影仪的标定程序时,需要将结构光图片与灰点相机拍摄得到的图片中,找出角点之间的对应性,使用了如下一条代码: Mat HomoMatri ...

  7. 单应性矩阵Homography计算和优化

    单应性矩阵,是用来描述两个平面之间的变换关系,是一个3x3的齐次矩阵. 图上的4个绿色的圈,两两可以对应,H可以表达第一张图变换到第二张图的转换关系.具体的表达式: aaa表示尺度信息,h1−h9h_ ...

  8. 透视变换 单应性矩阵怎么求 matlab,单应性(homography)变换的推导

    矩阵的一个重要作用是将空间中的点变换到另一个空间中.这个作用在国内的<线性代数>教学中基本没有介绍.要能形像地理解这一作用,比较直观的方法就是图像变换,图像变换的方法很多,单应性变换是其中 ...

  9. Homography 估计单应性矩阵代码实现

    import cv2 import numpy as np # 读取图片 img1 = cv2.imread('01.jpg') img2 = cv2.imread('02.jpg')# 计算SURF ...

  10. 单应性矩阵的相关理解

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zinnc/article/details/52319491 尽量写的通俗一点,因为从某种程度上讲,本 ...

最新文章

  1. 九、数据库群集部署、配置 (二)
  2. 兼容IE,chrome 等所有浏览器 回到顶部代码
  3. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 @Mixin 注解进行方法注入 | Mixin 混合多个类优先级分析 )
  4. 常用的Firefox浏览器插件、Chrome浏览器插件收藏
  5. 将py文件打包为exe可执行文件
  6. Java接口的防御性API演进
  7. java split函数应该注意的问题
  8. 树莓派3b能装java吗_树莓派3B-系统安装
  9. exchange管理控制台命令行 查看邮箱数据库信息、接收连接器、发送连接器 相关命令
  10. python第五章课后题答案_python程序设计基础(嵩天)第五章课后习题部分答案
  11. 11-11 11:11
  12. onvif协议是啥?
  13. 天力卓越消息服务器是什么意思,开票版药易通出现RPC服务器不可用是什么问 – 手机爱问...
  14. java j2se下载_安装JDK(J2SE)
  15. 图片传输(APP端将图片传至服务器端存储)
  16. 云计算技术,主要包括哪些关键技术?
  17. 【问题记录】labelImg:一款实用图片标注工具的安装和使用
  18. C#实现侏儒排序算法
  19. Swift基础(六)解包
  20. FFplay文档解读-39-视频过滤器十四

热门文章

  1. 0基础也可直接运行的微信表情包批量转换
  2. 代码-检测文件的编码
  3. 分省份碳排放量数据(2000-2019年)
  4. python下opencv安装
  5. js定时刷新页面数据
  6. 财务数字转换--大小写转换
  7. 自学C语言的步骤--菜鸟篇
  8. c++ 开根号程序 算法实现 C++函数同时返回两个值
  9. svn和git下载安装
  10. 产品经理们如何看待NPDP认证?