根据相机外参实现单应矩阵计算的理论与实践
论文阅读模块将分享点云处理,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 * oMc2
Mat R_2to1 = R1*R2.t();//同一平面两个不同相机坐标系的单应矩阵
// [compute-homography]
Mat H = cameraMatrix * R_2to1 * cameraMatrix.inv();//同一平面计算出两个图像间的单应矩阵H
H /= 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 * oMc2Mat 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方法介绍
如果你对本文感兴趣,请点击“原文阅读”获取知识星球二维码,务必按照“姓名+学校/公司+研究方向”备注加入免费知识星球,免费下载pdf文档,和更多热爱分享的小伙伴一起交流吧!
以上内容如有错误请留言评论,欢迎指正交流。如有侵权,请联系删除
扫描二维码
关注我们
让我们一起分享一起学习吧!期待有想法,乐于分享的小伙伴加入免费星球注入爱分享的新鲜活力。分享的主题包含但不限于三维视觉,点云,高精地图,自动驾驶,以及机器人等相关的领域。
分享及合作:群主微信“920177957”(需要按要求备注) 联系邮箱:dianyunpcl@163.com,欢迎企业来联系公众号展开合作。
点一下“在看”你会更好看耶
根据相机外参实现单应矩阵计算的理论与实践相关推荐
- Halcon 4点单标相机外参
1. 单标外参使用背景 如果摄像机系统没有变化,只是测量面发生了移动或旋转,此时重标相机外参可以解决问题,这种方法可以解决斜测的问题. 2. 主要函数: vector_to_pose( : : Wor ...
- cam_lidar_calibration标定速腾激光雷达和单目相机外参
目录 一.资源链接 二.代码测试 2.1安装依赖 2.2代码下载和修改 2.2.1 optimiser.h文件 2.2.2 feature_extractor.h文件 2.3编译代码 2.4测试数据集 ...
- 基于先验时间一致性车道线的IPM相机外参标定
文章:Online Extrinsic Camera Calibration for Temporally Consistent IPM Using Lane Boundary Observation ...
- mlcc激光雷达与相机外参标定初体验
论文阅读模块将分享点云处理,SLAM,三维视觉,高精地图相关的文章.公众号致力于理解三维视觉领域相关内容的干货分享,欢迎各位加入我,我们一起每天一篇文章阅读,开启分享之旅,有兴趣的可联系微信diany ...
- 【自动驾驶】31.【相机外参标定】、【相机障碍物后处理】【地面的2D点反投影到3D】的过程对比
相机的平移向量一般标定到imu坐标系或者车身坐标系,欧拉角 yaw.pitch.roll\color{red}yaw.pitch.rollyaw.pitch.roll是相对于前向相机坐标系的位姿: 前 ...
- ORBSLAM2单应矩阵计算及代码分析
单应矩阵代码分析 if(mpInitializer->Initialize(mCurrentFrame, //当前帧mvIniMatches, //当前帧和参考帧的特征点的匹配关系Rcw, tc ...
- 【学习总结】激光雷达与相机外参标定:原理与代码1
2023年2月重要补充 这个代码我个人觉得不好用且坑太多,所以后来换了一个.推荐大家用新的代码. 详见更新的一篇博客总结:[学习总结]激光雷达与相机外参标定:代码(cam_lidar_calibrat ...
- 小觅相机的相机标定全家桶(相机IMU,相机内参,相机外参)
性感帅哥博主在线标定小觅双目相机!!!(亲测有效系列!) 刚刚入手新小觅相机,结果飘出天际,很让人头疼!所以- 话不多说,开始骚操作! mkdir mynt_ws #创建文件夹 cd ~/mynt_w ...
- 单目相机外参标定及标定结果验证
运行前需要获得point3s.point2s对应的数值,明确坐标系(这里,前X右Y) import cv2 import numpy as np import math ############### ...
最新文章
- 温故而知新,6位顶级CV科学家聚首:计算机视觉中的深度学习方法vs传统方法...
- noip2005 过河
- pytorch 图像与tensor转换
- android SQLite数据库(转)
- python自动化开发_python自动化开发-2
- java查找链表中间元素_如何通过Java单次查找链表的中间元素
- java 验证码透明背景_Java中的证书透明度验证
- 模拟cmos集成电路设计_单级放大器中的噪声--CMOS模拟集成电路视频课程节选
- 小程序(仿微信发布说说功能)
- linux服务器MySQL数据从磁盘拷贝以及恢复
- 数据结构视频教程-绝对是史上最全的,共30个!!
- html5制作人物动作,骨骼动画制作新利器:快速制作动作人物动画,省时简单!...
- 在线作图丨差异分析——在线做Stamp分析
- 如何在微信环境中点击链接关注微信公众号
- 计算机毕业设计android的学生考勤请假app(源码+系统+mysql数据库+Lw文档)
- 求矩阵乘法及行列式的值
- 《操作系统原理》 记录 (41)
- 石墨文档 Websocket 百万长连接技术实践
- IO模型有哪些,讲讲你理解的nio ,他和bio,aio的区别是啥,谈谈reactor模型。
- 【R语言科研绘图】--- 柱状图