当前位置:网站首页>基于OpenCV的双目重建
基于OpenCV的双目重建
2022-07-30 05:44:00 【柠檬甜瓜】
单个相机标定求内参矩阵及畸变系数
这一部分可回顾:https://blog.csdn.net/qq_42007878/article/details/125860861
两个相机之间标定求旋转矩阵与平移向量
这一部分基于OpenCV函数:stereoCalibrate
双目校正(主要包括两方面:畸变矫正 和 立体矫正 。)
1、 使用函数 stereoRectify 计算立体校正所需映射矩阵,这里可以这样理解,这一步的目的是为了求取 R1, R2, P1, P2,其中 R1, R2 分别为左右相机去除畸变图像位姿变换到极线校正后位姿的旋转矩阵,而P1,P2分别为左右相机,空间中一点映射到极线校正后坐标系下一点的映射矩阵(类似于相机成像的映射矩阵M,但这里经过了校正),该函数各参数含义如下(参考:https://blog.csdn.net/qq_25458977/article/details/114829674,https://baike.baidu.com/item/stereoRectify/1594417):
cameraMatrix1– 第一个相机矩阵.
distCoeffs1– 第一个相机畸变参数.
cameraMatrix2– 第二个相机矩阵.
distCoeffs2– 第二个相机畸变参数.
imageSize– 用于校正的图像大小.
R– 第一和第二相机坐标系之间的旋转矩阵。
T– 第一和第二相机坐标系之间的平移矩阵.
R1– 输出第一个相机的3x3矫正变换(旋转矩阵) .
R2– 输出第二个相机的3x3矫正变换(旋转矩阵) .
P1–在第一台相机的新的坐标系统(矫正过的)输出 3x4 的投影矩阵
P2–在第二台相机的新的坐标系统(矫正过的)输出 3x4 的投影矩阵
Q–输出深度视差映射矩阵,如下:
矩阵Q是一个任意提供的矩阵(比如 stereoRectify(),请参阅reprojectImageTo3D所能得出的矩阵).
flags– 操作的 flag可以是零或者是CV_CALIB_ZERO_DISPARITY . 如果设置了CV_CALIB_ZERO_DISPARITY,函数的作用是使每个相机的主点在校正后的图像上有相同的像素坐标。如果未设置标志,功能还可以改变图像在水平或垂直方向(取决于极线的方向)来最大化有用的图像区域。
alpha– 自由缩放参数。如果是-1或没有,该函数执行默认缩放。否则,该参数应在0和1之间。alpha=0,校正后的图像进行缩放和偏移,只有有效像素是可见的(校正后没有黑色区域)。alpha= 1意味着校正图像的抽取和转移,所有相机原始图像素像保留在校正后的图像(源图像像素没有丢失)。显然,任何中间值产生这两种极端情况之间的中间结果。
newImageSize– 校正后新的图像分辨率。相同的尺寸应传递给initUndistortRectifyMap()(见OpenCV样品目录stereo_calib.cpp样品)。当(0,0)传递(默认),它设置为原始图像大小。设置为较大的值能帮助你保存原始图像的细节,特别是当有一个大的径向畸变时。
validPixROI1– 校正后的图像可选的输出矩形,里面所有像素都是有效的。如果alpha= 0,ROIs覆盖整个图像。否则,他们可能会比较小。
validPixROI2– 校正后的图像可选的输出矩形,里面所有像素都是有效的。如果alpha= 0,ROIs覆盖整个图像。否则,他们可能会比较小。
2、 使用函数 initUndistortRectifyMap 计算原始图像到校正图像(包含畸变矫正与立体校正)之间的映射变换,这里可以这样理解,这一步的目的是为了求得实现相机拍摄图像在一个平面所需的映射关系,映射关系存储在map1和map2中,该函数各参数含义如下:
cameraMatrix——输入的摄像机内参数矩阵
distCoeffs——输入的摄像机畸变系数矩阵
R——输入的第一和第二相机坐标系之间的旋转矩阵
newCameraMatrix——输入的校正后的3X3摄像机矩阵(也可用cvStereoRectify()得出的3X4的左或右投影矩阵,其实系统会自动提取该矩阵前三列的有用部分作为输入参数)
size——摄像机采集的无失真图像尺寸
m1type——map1的数据类型,可以是CV_32FC1或CV_16SC2
map1——输出的X坐标重映射参数
map2——输出的Y坐标重映射参数
** 3、**使用函数 remap(原影像映射到目标影像的函数,即将不平行的两个图像实现平行) 对左右视角原始图像进行映射;
立体匹配与测距
** 1、** 根据双目矫正图像,通过 BM 或 SGM 等立体匹配算法对其进行立体匹配(在右边图像上找到与左边图像上一点p1的对应点p2)
**2、**视差计算,根据立体匹配计算视差x1 - x2
**3、**深度估计
(1)根据视差图反解Z,已知x1 - x2 = (Bf)/Z,其中x1-x2为视差,B为两相机基线,f为焦距,Z为空间中一点到成像设备的距离,Z = (Bf) / (x1 - x2)
(2)根据stereoRectify校正所得矩阵Q使用OpenCV函数reprojectImageTo3D求取深度图
点云获取与显示
这一步其实就是根据得到的视差图,以及相机的内参矩阵,将2图像映射成3维点,(因为开始是以左相机为基准求解的两个相机的旋转、平移矩阵,所以这里以左相机图像为例);
(1)已有条件
①由左右相机所获图像(left,right)求得的视差图disparity;
②左相机内参数矩阵P;
③一张左相机所获凸显left;
(2)方法
已知图像中一点视差 x1-x2 = (b*f) / Z;
其中 x1-x2 为视差,b为亮相机基线,f为焦距,Z为空间一点距离相机的距离;
由:u = (fx * (X / Z)) + cx, V =fy * (Y / Z)+ cy,可得真实世界左相机相机坐标系下一点,X = ((u - cx) * Z ) / fx,Y同理,而Z = Z
其中(u,v)为图像上一点,(X,Y,Z)为左相机坐标系下空间中一点。
总结
双目重建流程:
(1)左右相机标定;
目的:求相机内参
(2)双目标定;
目的:求左右相机之间的旋转平移矩阵;为双目校正做铺垫;
(3)双目校正(畸变校正与立体校正);
目的:a.畸变校正 - 去除畸变;b.立体校正 - 主要是极线约束,即将不平行的左右图像通过极线约束将其转换为平行图像且y坐标值相等;为立体匹配做铺垫;
(4)立体匹配;
目的:在右相机图像上找到左相机图像上的对应点;为视差估计做铺垫;
(5)视差估计;
目的:求取视差图像;方法:三角测量原理(可回顾:https://blog.csdn.net/qq_42007878/article/details/125871861)
(6)点云获取
目的:求取点云;方法:回顾:点云获取与显示
边栏推荐
- 十、Kotlin基础学习:1、延迟加载;2、异常处理;3、使用 throw 主动抛出异常;4、自定义异常;
- 常用损失函数(一):Focal Loss
- 抽象工厂模式(Swift 实现)
- Self-augmented Unpaired Image Dehazing via Density and Depth Decomposition程序运行记录
- Using PyQt5 to add an interface to YoloV5 (1)
- 十四、Kotlin进阶学习:一、内联函数 inline;二、泛型;三、泛型约束;四、子类与子类型;
- 二十二、Kotlin进阶学习:简单学习RecyclerView实现列表展示;
- 线程的5种状态
- 对于国内数据交换平台的分析
- 基于遥感解译与GIS技术环境影响评价图件制作(最新导则)
猜你喜欢
Dropout原理及作用
MYSQL一站式学习,看完即学完
MySQL开窗函数
八、Kotlin基础学习:1、数据类;2、单例;3、伴生对象;4、密封类;
Nodejs PM2 monitoring and alarm email (2)
目标检测中的知识蒸馏方法
Flink CDC implements Postgres to MySQL streaming processing transmission case
MySQL achievement method 】 【 5 words, single table SQL queries
Detailed explanation of regular expression syntax and practical examples
树莓派OpenCV+OpenCV-contrib
随机推荐
基于遥感解译与GIS技术环境影响评价图件制作(最新导则)
十九、Kotlin进阶学习:1、管道数据的收和发;2、管道的关闭;3、生产者和消费者;4、管道的缓存区;
基于全球模式比较计划CMIP6与区域气候-化学耦合模式 WRF-Chem 的未来大气污染变化模拟
十七、Kotlin进阶学习:1、守护线程;2、线程和协程之间的效率对比;3、取消协程;
Pytorch(一):动态图机制以及框架结构
二十二、Kotlin进阶学习:简单学习RecyclerView实现列表展示;
The number of warehouse 】 data quality
边境的悍匪—机器学习实战:第十一章 训练深度神经网络
sql中 exists的用法
用户密码加密编码使用 Bcrypt 代替 MD5,SHA1和SHA256
MYSQL一站式学习,看完即学完
Go简单实现协程池
Twenty-two, Kotlin advanced learning: simply learn RecyclerView to achieve list display;
大气颗粒物 PMF 源解析
Common exception analysis of Redis client
21. Kotlin Advanced Learning: Implementing Simple Network Access Encapsulation
Kaggle-M5
Function functional interface and application
Oracle数据库SQL优化详解
Arthas 命令解析(watch/tt/sc)