根据相机外参实现单应矩阵计算的理论与实践

论文阅读模块将分享点云处理,SLAM,三维视觉,高精地图相关的文章。公众号致力于理解三维视觉领域相关内容的干货分享,欢迎各位加入我,我们一起每天一篇文章阅读,开启分享之旅,有兴趣的可联系微信dianyunpcl@163.com。

单应矩阵介绍

单应性在计算机视觉领域是一个非常重要的概念,它在图像校正、图像拼接、俯视图生成,相机位姿估计、视觉SLAM等领域有非常重要的作用。

单应性(Homography)变换是将一幅图像中的点映射到另一幅图像中相应点的变换关系:

单应矩阵是一个3x3矩阵,具有8个自由度,通常为归一化后表达式,其尺度为1。

下面展示了不同类型的变换,但都与两个平面之间的变换有关。

(1)真实平面和图像平面

(2)由两个相机位置拍摄的平面

(3)围绕其投影轴旋转的相机采集的图像进行拼接

所以单应性矩阵主要用来解决两个问题:

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

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

外参求解单应矩阵理论

这里将主要讲解以下已知两个相机的位姿如何实现图像的拼接,主要公式就是根据外参计算H矩阵。

单应性将两个平面之间的变换联系起来,这样就可以计算出从第二个平面视图转到第一个平面视图下相应相机位移,在已知内外参的情况下有

使用齐次坐标系表达式将三维世界点转转到相机坐标系下:

使用矩阵乘法可以轻松地将一图像帧中表示的点转换为另一帧图像中:c1Mo是第一帧的位姿,c2Mo是第二帧的位姿。要将相机1中表示的三维点变换为相机2帧的坐标下,其变换公式为:

以上公式对应的是:同一平面两个不同相机坐标系的单应矩阵。如果要同一平面计算出两个图像间的单应矩阵H,则需要内参,此时左边乘以K,右边乘以K的逆矩阵。

为了更好的理解,这里写了一个demo,并与上述的理论对应(注意这里是将第二帧转到第一帧的坐标系下)。

Mat cameraMatrix = (Mat_<double>(3, 3) << 700.0, 0.0, 320.0, 0.0, 700.0, 240.0, 0, 0, 1);Mat R1 = c1Mo(Range(0, 3), Range(0, 3));Mat R2 = c2Mo(Range(0, 3), Range(0, 3)); //c1Mo * oMc2Mat R_2to1 = R1*R2.t();//同一平面两个不同相机坐标系的单应矩阵// [compute-homography]Mat H = cameraMatrix * R_2to1 * cameraMatrix.inv();//同一平面计算出两个图像间的单应矩阵HH /= H.at<double>(2, 2);//归一化cout << "H:\n" << H << endl;

根据求解的单应矩阵实现两个视图的拼接实例显示如下

拼接的结果如下:

warpPerspective(img2, img_stitch, H, Size(img2.cols * 2, img2.rows)); Mat half = img_stitch(Rect(0, 0, img1.cols, img1.rows));

完整代码如下:

void basicPanoramaStitching(const string &img1Path, const string &img2Path){ Mat img1 = imread("Blender_Suzanne1.jpg"); Mat img2 = imread("Blender_Suzanne2.jpg"); //! [camera-pose-from-Blender-at-location-1] Mat c1Mo = (Mat_<double>(4, 4) << 0.9659258723258972, 0.2588190734386444, 0.0, 1.5529145002365112, 0.08852133899927139, -0.3303661346435547, -0.9396926164627075, -0.10281121730804443, -0.24321036040782928, 0.9076734185218811, -0.342020183801651, 6.130080699920654, 0, 0, 0, 1); //! [camera-pose-from-Blender-at-location-1] //! [camera-pose-from-Blender-at-location-2] Mat c2Mo = (Mat_<double>(4, 4) << 0.9659258723258972, -0.2588190734386444, 0.0, -1.5529145002365112, -0.08852133899927139, -0.3303661346435547, -0.9396926164627075, -0.10281121730804443, 0.24321036040782928, 0.9076734185218811, -0.342020183801651, 6.130080699920654, 0, 0, 0, 1); //! [camera-pose-from-Blender-at-location-2] Mat cameraMatrix = (Mat_<double>(3, 3) << 700.0, 0.0, 320.0, 0.0, 700.0, 240.0, 0, 0, 1); Mat R1 = c1Mo(Range(0, 3), Range(0, 3)); Mat R2 = c2Mo(Range(0, 3), Range(0, 3)); //c1Mo * oMc2 Mat R_2to1 = R1*R2.t(); //! [compute-homography] Mat H = cameraMatrix * R_2to1 * cameraMatrix.inv(); H /= H.at<double>(2, 2); cout << "H:\n" << H << endl; //! [compute-homography] //! [stitch] Mat img_stitch; warpPerspective(img2, img_stitch, H, Size(img2.cols * 2, img2.rows)); Mat half = img_stitch(Rect(0, 0, img1.cols, img1.rows)); img1.copyTo(half); //! [stitch] Mat img_compare; Mat img_space = Mat::zeros(Size(50, img1.rows), CV_8UC3); hconcat(img1, img_space, img_compare); hconcat(img_compare, img2, img_compare); imshow("Compare images", img_compare); imshow("Panorama stitching", img_stitch); waitKey(); }

以上是根据外参实现了同一相机不同位姿采集的图像的拼接,其主要原理主要是根据外参计算出单应性矩阵,将第二帧采集的图像变换到第一帧视角下的结果,最终实现拼接。这里我想到了前视图转换俯视图的方法,同样也是变换视角的问题,只是这里的俯视图的虚拟相机的参数需要自己设置,有时间再更新。

资源

三维点云论文及相关应用分享

【点云论文速读】基于激光雷达的里程计及3D点云地图中的定位方法

3D目标检测:MV3D-Net

三维点云分割综述(上)

3D-MiniNet: 从点云中学习2D表示以实现快速有效的3D LIDAR语义分割(2020)

win下使用QT添加VTK插件实现点云可视化GUI

JSNet:3D点云的联合实例和语义分割

大场景三维点云的语义分割综述

PCL中outofcore模块---基于核外八叉树的大规模点云的显示

基于局部凹凸性进行目标分割

基于三维卷积神经网络的点云标记

点云的超体素(SuperVoxel)

基于超点图的大规模点云分割

更多文章可查看:点云学习历史文章大汇总

SLAM及AR相关分享

【开源方案共享】ORB-SLAM3开源啦!

【论文速读】AVP-SLAM:自动泊车系统中的语义SLAM

【点云论文速读】StructSLAM:结构化线特征SLAM

SLAM和AR综述

常用的3D深度相机

AR设备单目视觉惯导SLAM算法综述与评价

SLAM综述(4)激光与视觉融合SLAM

Kimera实时重建的语义SLAM系统

SLAM综述(3)-视觉与惯导,视觉与深度学习SLAM

易扩展的SLAM框架-OpenVSLAM

高翔:非结构化道路激光SLAM中的挑战

SLAM综述之Lidar SLAM

基于鱼眼相机的SLAM方法介绍

(0)

相关推荐

  • 自动化设计基础讲解-机械手,相机(CCD)9点标定

    在机器视觉应用中,相机标定技术需要准确的相机内参数和外参数作为重构算法的输入和先决条件,通过标定算法,可以计算相机的投影矩阵.本文讲解机械手-相机9点标定原理 1.目的 建立相机坐标系与机械手坐标系的 ...

  • 【从零学习OpenCV 4】两图像间的像素操作

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 使用Opencv,大恒C++ SDK采集大恒水星相机图像

    在项目中,使用了大恒的水星相机,需要把图存成Opencv的Mat形式.大恒C++ SDK采集的图像数据不能直接把图像的数据存进Mat,需要将原始数据(我这里是BayerRG8)经过格式转换之后转变成R ...

  • 基于先验时间一致性车道线的IPM相机外参标定

    文章:Online Extrinsic Camera Calibration for Temporally Consistent IPM Using Lane Boundary Observation ...

  • 61条痣相学的介绍和应痣歌诀

    生于脸上的痣,大都不是好痣,因为它是体内器官,病变的讯号.当然也有好痣,不过总是少数,红色.黑亮色.长毛主吉,所以说:面无好痣.另外有一个奇妙现象,脸上的痣,会在身体相对应的地方出现.如眉毛有痣,肩膀 ...

  • 洪一平——指对三角相混合 参变分离一统解

    公众号"邹生书数学"创建于2018年8月28日.     开号宗旨:为热爱学习和研究的高中数学教师和教研员搭建学习交流平台,提升教学能力,促进专业发展.本公众号致力传播数学文化,发 ...

  • 单应桂书画集

    1933年9月生于济南,山东高密人,现任山东艺术学院教授,硕士研究生导师.1933年生于济南.斋号听泉书屋.邀月穆.1949年起任山东新华书店编辑部美术助理编辑.1956年入中央美术学院国画系,196 ...

  • 基于Opencv的图像单应性转换实战

    重磅干货,第一时间送达 同形转换 我们所常见的都是以这样的方式来处理图像:检测斑点,分割感兴趣的对象等.我们如何将它们从一种形式转换为另一种形式来处理这些图像呢?通过单应矩阵快速转换图像可以实现这个需 ...

  • 基础矩阵,本质矩阵,单应性矩阵讲解

    最近公众号组织了ORB-SLAM2理论与代码的学习会,正常进行中,有兴趣的可以积极参与第三期:一起来学SLAM 其中ORB-SLAM点云地图中相机的位姿初始化,无论算法工作在平面场景,还是非平面场景下 ...

  • 案例:“撤单失败”工单应提供证据

    系统撤单处理是包快类邮件特殊作业项目.在业务规定条件下(双击可阅读 :包快邮件撤单申请是否成功的判断条件),收寄端可对相关邮件实施撤单处理.但近日,小编遇到一种特殊情况,即符合撤单条件时,相关邮件在系 ...

  • 在OpenCV中使用单应性进行姿势估计

    重磅干货,第一时间送达 什么是单应性 单应性是一种平面关系,可将点从一个平面转换为另一个平面.它是3乘3的矩阵,转换3维向量表示平面上的2D点.这些向量称为同构坐标,下面将进行讨论.下图说明了这种关系 ...

  • 什么是单应性矩阵?

    重磅干货,第一时间送达 你们是否知道人工智能正在改变体育产业?AI助教在比赛前和比赛中能帮助教练增强战略决策,通过使用高速相机和可穿戴传感器,人工智能现在可以测量场上每个球员的运动和位置.但是,AI如 ...