Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Homography matrix(单应性矩阵)在广告投放中的实践

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

作者头像
3D视觉工坊
发布于 2020-12-11 08:03:30
发布于 2020-12-11 08:03:30
1.5K0
举报

前言

由于近期在研究相机与投影仪的标定程序时,需要将结构光图片与灰点相机拍摄得到的图片中,找出角点之间的对应性,使用了如下一条代码:

Mat HomoMatrix = findHomography( imgPoints , projPoints, CV_RANSAC);

如果看过【视觉IMAX】中之前发表过的两篇文章:1)图像处理的仿射变换与透视变换 2透视变换进阶,应该对findHomography()函数不会感到陌生。

但是前面的两篇文章中,对于单应性矩阵并未做太多讲解。恰巧,今天【视觉IMAX】知识星球中的一个小伙伴也对单应性矩阵进行了发问。

本文我将尽我所能,和大家聊一聊单应性矩阵的基本概念、作用及其的一个简单应用案例,如有不到之处,还望批评指正。

一 单应性矩阵概念

对于单应性矩阵的概念,此处结合着《Learning OpenCV》,对其进行简单介绍。

计算机视觉中,平面的单应性被定义为从一个平面到另一个平面的投影映射(小注:术语「单应性」在不同学科上有各种不同的含义。例如,在数学上,它有更通用的意思。在计算机视觉中,对单应性最感兴趣的部分只是其他意义中的一个子集)。

因此,一个二维平面上的点映射到摄像机成像仪上的映射就是平面单应性的例子。如果对点Q到成像仪上的点q的映射使用齐次坐标,这种映射可以用矩阵相乘的方式表示。若有以下定义:

则可以将单应性简单表示为:

这里引入参数s,它是一个任意尺度比例(目的是使得单应性被定义到该尺度比例)。通常习惯放在H的外面。

稍微利用一点几何和矩阵代数的知识,便可以求解这个变换矩阵。最重要的是,H有两部分:用于定位观察的物体平面的物理变换和使用摄像机内参数矩阵的投影

图1.1:用单应性来描述平面物体的观测:从物体平面到图像平面的映射,同时表征了这两个平面的相对位置和摄像机投影矩阵

物理变换部分是与观测到的图像平面相关的部分旋转R和部分平移t的影响之和。因为使用齐次坐标,我们可以把它们组合到一个单一矩阵中,如下所示:(注:这里W=[R t]是一个3x4矩阵,前三列包含R的9个元素,最后一列由拥有三个元素的向量t组成。)

然后,通过乘以

,得到摄像机矩阵M(用来表示影射坐标),即:

这看起来已经完成了。但实际上,我们的关注点不是表征所有空间的坐标

,而只是定义我们所寻找的平面的坐标

。这需要简化。

考虑到一般性,我们可以选择定义这个物体平面,使得Z=0。这样做的原因是如果把旋转矩阵也分解为3个3x1向量(即R=[r1 r2 r3]),那么其中的一个列向量就不需要了。具体如下:

映射目标点到成像仪的单应性矩阵H可以完全用H=sM[r1 r2 t]表述,其中:

注意,H现在是3x3矩阵。

OpenCV使用上述公式来计算单应性矩阵。它使用同一物体的多个图像来计算每个视场的旋转和平移,同时也计算摄像机的内参数(对所有视场不变)。如我们所讨论的,旋转和平移分别用三个角度和三个偏移量定义,因此对每个视场,有6个未知量。这没有问题,因为一个已知平面物体(如棋盘)能够提供8个方程,即映射一个正方形到四边形可以用4个(x,y)点来描述。每个新的图像帧为计算新的6个未知量提供8个方程,因此若给定足够图像,我们能够计算出未知内参数的任何值(或者更多)。

通过下面的简单方程,单应性矩阵H把源图像平面上的点集位置与目标图像平面(通常为成像仪平面)上的点集位置联系起来:

注意到,我们可以在不知道摄像机内参数的情况下计算H。事实上,OpenCV正是利用从多个视场计算多个单应性矩阵的方法来求解摄像机内参数,如下文所示。

OpenCV提供了一个方便的函数findHomography(),以对应点序列作为输入,返回最佳描述这些对应点的单应性矩阵。我们至少需要4个点来求解H,但是如果有,通常提供更多的点(自然,要保证精确解我们只需要4个对应点。如果提供更多,我们的计算结果便是最小二乘误差意义上的最优解)。使用更多解的好处是尽可能减少噪声和其他不确定因素所带来的干扰。

输入数组srcPoints和dstPoints,即可以是Nx2,也可以是Nx3矩阵。对于前者,点是一像素坐标表示,对于后者,希望是其次坐标。返回的变量是Mat矩阵,其值为3x3矩阵,以保证反向投影误差最小。至于拟合方法,可以选择八点法、ransac、lmeds等,对于噪音比较多的情况,ransac和lmeds会取得比较好的效果。文章开头部分,也是选用的ransac方法。

在单应性矩阵中只有8个独立参数,我们选择归一化,使得

=1。但通常的方法是对整个单应性矩阵乘以一个尺度比例。

二 单应性矩阵的作用

由上面的分析可知,单应性矩阵主要用来解决两个问题:

1) 表述真实世界中一个平面与对应它图像的透视变换

2) 通过透视变换实现图像从一种视图变换到另外一种视图

除了概念的理解之外,最重要的,我们更关心它的应用场景,下面就从应用层面简单说说单应性矩阵的应用。

a)用来实现图像拼接时的对齐问题

b)可以用于计算机图形学中的纹理渲染与计算平面阴影

c) 解决拍照时候图像扭曲问题。这可以见文章开篇介绍的两篇文章。

三 一个简单的应用案例

如果我们现在希望在路边的广告牌中,将广告牌中的内容替换为我们自己的宣传内容(当然是虚拟的)。街拍图如下所示:

接下来,我想将我的公众号宣传图投放到红框中,该如何操作呢?

接下来是最重要的步骤:在原图中获取到对应的广告牌位置,得到广告牌的四个角坐标,通过计算单应性矩阵实现内容替换,最终生成的效果图如下:

附上实现的代码,如下:

#include <opencv.hpp> #include <iostream> #include <math.h> using namespace cv; using namespace std; int main(int argc, char** argv) { // load images Mat src = imread("E:/8-LabPic/imgTest/srcImg.jpg"); if (!src.data) { printf("could not load image...\n"); return -1; } // show images namedWindow("input image", CV_WINDOW_AUTOSIZE); imshow("input image", src); Mat replaceImg =imread("E:/ 8-LabPic/imgTest/replaceImg.jpg"); imshow("adv content", replaceImg); // 定义两个平面上四个角坐标 vector<Point> src_corners(4); vector<Point> dst_corners(4); // 原图像平面四点坐标 src_corners[0] = Point(0, 0); src_corners[1] = Point(replaceImg.cols, 0); src_corners[2] = Point(0, replaceImg.rows); src_corners[3] = Point(replaceImg.cols, replaceImg.rows); // 目标平面四个角坐标 dst_corners[0] = Point(218,50); dst_corners[1] = Point(557, 30); dst_corners[2] = Point(273, 236); dst_corners[3] = Point(559, 215); // 计算单应性矩阵与透视变换 Mat h = findHomography(src_corners, dst_corners); Mat output_img; warpPerspective(replaceImg, output_img, h, src.size()); // create mask Mat m1 = Mat::zeros(replaceImg.size(), CV_8UC1); m1 = Scalar(255); Mat mask_output; warpPerspective(m1, mask_output, h, src.size()); imshow("Mask Result", mask_output); // use mask Mat result1; add(output_img, output_img, result1, mask_output); Mat result2; bitwise_not(mask_output, mask_output); add(src, result1, result2, mask_output); // put them together Mat result; add(result1, result2, result); imshow("Final Result", result); imwrite("E:/8-LabPic/imgTest/result.jpg", result); waitKey(0); return 0; }

四 跋

顺便交代一下:如果已知图像平面的角点坐标,同时也求出了图像平面与投影平面之间的单应性矩阵,那么,对应点在投影仪中的坐标该如何求呢?

Mat HomoMatrix = findHomography( imgPoints, projPoints, CV_RANSAC); Point3d transformedCorner = Point3d( Mat(HomoMatrix * Mat( Point3d(cornerInImage.x, cornerInImage.y, 1.0)))); cornerInProjector=Point2f(transformedCorner.x/ transformedCorner.z,transformedCorner.y/ transformedCorner.z);

文章中对于单应性的理解,讲解不到位的地方,还望多多交流,批评指正。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-08-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 3D视觉工坊 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
图像处理之理解Homography matrix(单应性矩阵)
图像处理之理解Homography matrix(单应性矩阵) 单应性矩阵是投影几何中一个术语,本质上它是一个数学概念,但是在OpenCV中却是有几个函数与透视变换相关的函数,都用到了单应性矩阵的概念与知识。小编跟很多人一样,刚开始学习图像处理对单应性矩阵不是很了解,通过项目实践慢慢知道了一些这方面的知识和自己对它的理解,就跟大家分享一下。 单应性矩阵概念 这里说的单应性矩阵主要是指平面单应性矩阵,在三轴坐标中XYZ,Z=1这个有点类似于三维的齐次坐标。单应性矩阵主要用来解决两个问题, 一是表述真实世界中一
OpenCV学堂
2018/04/04
36.6K0
图像处理之理解Homography matrix(单应性矩阵)
OpenCV 透视变换
透视变换是将图像从一个视平面投影到另外一个视平面的过程,所以透视变换也被称为投影映射(Projection Mapping)。在图像的仿射变换中需要变换矩阵是一个2x3的两维平面变换矩阵,而透视变换本质上空间立体三维变换,根据其次坐标方差,要把三维坐标投影到另外一个视平面,就需要一个完全不同的变换矩阵M,所以这个是透视变换跟OpenCV中几何仿射变换最大的不同。变换公式为:
chaibubble
2022/05/07
7340
OpenCV 透视变换
基础矩阵,本质矩阵,单应性矩阵讲解
最近公众号组织了ORB-SLAM2理论与代码的学习会,正常进行中,有兴趣的可以积极参与第三期:一起来学SLAM
点云PCL博主
2019/08/08
9.4K0
基础矩阵,本质矩阵,单应性矩阵讲解
3_相机模型
相机标定对于联系相机测量和真实三维世界测量也很重要。它的重要性在于场景不仅仅是三维的,也是物理单位度量的空间。因此,确定相机的自然单位(像素)与物理单位(如mm)的关系是三维场景重构的重要部分。相机标定的过程既给出相机的几何模型又给出透镜的畸变模型,这两个模型定义了相机的内参。
用户5908113
2024/02/29
1440
3_相机模型
单应性矩阵应用-基于特征的图像拼接
前面写了一篇关于单应性矩阵的相关文章,结尾说到基于特征的图像拼接跟对象检测中单应性矩阵应用场景。得到很多人留言反馈,让我继续写,于是就有这篇文章。这里有两张照片(我手机拍的),背景是我老家的平房,周围是一片开阔地带,都是麦子。有图为证:
OpenCV学堂
2020/02/21
3.3K1
OpenCV单应性矩阵发现参数估算方法详解
OpenCV在通过特征描述子完成描述子匹配之后,会得到一些关键点对,我们会把这些关键点对分别添加到两个vector对象中,作为输入参数,调用单应性矩阵发现函数来发现一个变换矩阵H,函数 findHomography 就完成了这样的功能,常见的调用代码如下:
小白学视觉
2020/02/14
3.2K0
OpenCV4.4 中SIFT特征匹配调用演示
大家好,听说OpenCV4.4 已经把SIFT跟SURF特征提取又重新get回来了,可以不需要编译OpenCV源码,直接下载官方预编译版本的就可以直接使用了。如果你还不知道SIFT特征是什么,就看这里的这篇文章就好啦。
OpenCV学堂
2020/08/06
3.1K0
基于先验时间一致性车道线的IPM相机外参标定
文章:Online Extrinsic Camera Calibration for Temporally Consistent IPM Using Lane Boundary Observations with a Lane Width Prior
点云PCL博主
2022/02/10
2K0
基于先验时间一致性车道线的IPM相机外参标定
OpenCV4.5.x 中SIFT特征匹配调用演示
点击上方蓝字关注我们 微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识 OpenCV4.4版本以后已经把SIFT跟SURF特征提取又重新get回来了,可以不需要编译OpenCV源码,直接下载官方预编译版本的就可以直接使用了。但是很多人还以为必须要编译源码才能使用SIFT特征检测的函数!如果还不知道SIFT特征是什么,就看这里的这篇文章就好啦。 OpenCV SIFT特征算法详解与使用 01 创建SIFT特征提取器 下面就来验证一下是否真的可以了,请看步骤与过程,首先创建SIFT特征提取器
OpenCV学堂
2022/08/29
1.6K0
OpenCV4.5.x 中SIFT特征匹配调用演示
根据相机外参实现单应矩阵计算的理论与实践
论文阅读模块将分享点云处理,SLAM,三维视觉,高精地图相关的文章。公众号致力于理解三维视觉领域相关内容的干货分享,欢迎各位加入我,我们一起每天一篇文章阅读,开启分享之旅,有兴趣的可联系微信dianyunpcl@163.com。
点云PCL博主
2022/02/10
2.8K0
根据相机外参实现单应矩阵计算的理论与实践
【5】OpenCV2.4.9实现图像拼接与融合方法【SURF、SIFT、ORB、FAST、Harris角点 、stitch 】
本文出现的数据结果和码源见:https://download.csdn.net/download/sinat_39620217/18269470
汀丶人工智能
2022/12/21
3.3K0
【5】OpenCV2.4.9实现图像拼接与融合方法【SURF、SIFT、ORB、FAST、Harris角点 、stitch 】
OpenCV中的透视变换介绍
透视变换原理 透视变换是将图像从一个视平面投影到另外一个视平面的过程,所以透视变换也被称为投影映射(Projection Mapping)。我们知道在图像的仿射变换中需要变换矩阵是一个2x3的两维平面变换矩阵,而透视变换本质上空间立体三维变换,根据其次坐标方差,要把三维坐标投影到另外一个视平面,就需要一个完全不同的变换矩阵M,所以这个是透视变换跟OpenCV中几何仿射变换最大的不同。 OpenCV中透视变换的又分为两种: - 密集透视变换 - 稀疏透视变换 我们经常提到的对图像的透视变换都是指密集透视变换,
OpenCV学堂
2018/04/04
3.1K0
OpenCV中的透视变换介绍
利用单应性矩阵实现文档对齐显示
有时候文本图像,需要适当的校正之后才会得到比较好的对齐显示,常用的方法有两个,一个是基于几何变换,另外一个是基于透视变换。常见的处理步骤如下:
OpenCV学堂
2020/04/14
9510
利用单应性矩阵实现文档对齐显示
一次实践:给自己的手机摄像头进行相机标定
不得不说,现在的计算机视觉技术已经发展到足够成熟的阶段了,还记得笔者刚工作的时候,相机标定还是个很神秘的技术,只有少数专业人员能够做,网上也找不到什么相关的资料。但是现在相机标定已经是一个非常普遍的技术了,也有不少的资料的可以参考,因此笔者突发奇想,既然那些大部头的相机可以标定,那么我们使用的手机摄像头一定也可以标定。因此,笔者就记录一下给自己手机摄像头的具体实践,算是弥补下当年没有学习到该技术的遗憾,毕竟要学习一项技术最好的办法就是亲自实践一下。
charlee44
2024/12/14
5360
一次实践:给自己的手机摄像头进行相机标定
单应性Homograph估计:从传统算法到深度学习
单应性原理被广泛应用于图像配准,全景拼接,机器人定位SLAM,AR增强现实等领域。这篇文章从基础图像坐标知识系为起点,讲解图像变换与坐标系的关系,介绍单应性矩阵计算方法,并分析深度学习在单应性方向的进展。
3D视觉工坊
2020/11/11
2.2K0
单应性Homograph估计:从传统算法到深度学习
张正友相机标定Opencv实现以及标定流程&&标定结果评价&&图像矫正流程解析(附标定程序和棋盘图)
使用Opencv实现张正友法相机标定之前,有几个问题事先要确认一下,那就是相机为什么需要标定,标定需要的输入和输出分别是哪些?
用户1148525
2019/05/29
7.3K0
张正友相机标定Opencv实现以及标定流程&&标定结果评价&&图像矫正流程解析(附标定程序和棋盘图)
基于OpenCV的位姿估计
单应性是一种平面关系,可将点从一个平面转换为另一个平面。它是一个3乘3的矩阵,转换3维矢量表示平面上的2D点。这些向量称为同质坐标,下面将进行讨论。下图说明了这种关系。这四个点在红色平面和图像平面之间相对应。单应性存储相机的位置和方向,这可以通过分解单应性矩阵来检索。
小白学视觉
2020/11/05
1.8K0
基于OpenCV的位姿估计
Android OpenCV(十):图像透视变换
透视变换的方程组有8个未知数,所以要求解就需要找到4组映射点,四个点就刚好确定了一个三维空间。
Vaccae
2021/01/06
1.2K0
Android OpenCV(十):图像透视变换
理解单目相机3D几何特性
激光雷达技术、以及立体视觉通常用于3D定位和场景理解研究中,那么单个摄像头是否也可以用于3D定位和场景理解中吗?所以我们首先必须了解相机如何将3D场景转换为2D图像的基本知识,当我们认为相机坐标系中的物体场景是相机原点位置(0,0,0)以及在相机的坐标系的X、Y、Z轴时,摄像机将3D物体场景转换成由下面的图描述的方式的2D图像。
点云PCL博主
2022/04/06
1.8K0
理解单目相机3D几何特性
VC++中使用OpenCV对原图像中的四边形区域做透视变换
最近闲着跟着油管博主murtazahassan,学习了一下LEARN OPENCV C++ in 4 HOURS | Including 3x Projects | Computer Vision,对应的Github源代码地址为:Learn-OpenCV-cpp-in-4-Hours
ccf19881030
2024/01/17
7100
VC++中使用OpenCV对原图像中的四边形区域做透视变换
相关推荐
图像处理之理解Homography matrix(单应性矩阵)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档