【OpenCV】双目测距(双目标定、双目校正和立体匹配)

【OpenCV】双⽬测距(双⽬标定、双⽬校正和⽴体匹配)转载双⽬测距的blog.
本⽂采⽤MATLAB标定⼯具箱和OpenCV3.10来实现双⽬测距,设备为两个CMOS⼯业相机和相应的双⽬云台。
⾸先感谢CSDN上两位⼤神前辈邹宇华和scyscyao,虽然是六年前的博客,OpenCV也从1.0的版本更新到了3.1版本,但博客对机器视觉初学者来说仍然提供了巨⼤的帮助。本⽂主要参考了 OpenCV学习笔记(17)双⽬测距与三维重建的OpenCV实现问题集锦(⼆)双⽬定标与双⽬校正、OpenCV学习笔记(18)双⽬测距与三维重建的OpenCV实现问题集锦(三)⽴体匹配与视差计算、分享⼀些OpenCV实现⽴体视觉的经验、双摄像头测距的OpenCV实现、学习笔记:使⽤opencv做双⽬测距(相机标定+⽴体匹配+测距).、OPENCV3.0 双⽬⽴体标定等⽂章,并摘录了部分内容。
由于初学机器视觉,有些问题尚不是很清楚,⽂中不免存在错误,还请观者指正。
⼀、双⽬标定
双⽬摄像头标定不仅要得出每个摄像头的内部参数,还需要通过标定来测量两个摄像头之间的相对位置(即右摄像头相对于左摄像头的平移向量 t和旋转矩阵R)。
由于OpenCV中StereoCalibrate标定的结果极其不稳定,甚⾄会得到很夸张的结果,所以最后还是决定Matlab标定⼯具箱⽴体标定,再将标定的结果读⼊OpenCV,来进⾏后续图像校准和匹配。
⾸先对左右摄像头分别进⾏标定,得到两个摄像头各⾃的内参矩阵和畸变参数向量。下图是单⽬标定的结果⽰意图和反投影误差分析图。
左右摄像头都标定完成之后,就可以利⽤单⽬标定得到的两个摄像头的参数进⾏⽴体标定。下图是双⽬标定的结果⽰意图。
注意事项:
1. 采集棋盘图的时候要注意,尽量让棋盘占据尽可能多的画⾯,这样可以得到更多有关摄像头畸变⽅⾯的信息。
2. 在标定⼯具箱中,可以通过reproject on images,得到根据当前标定结果得到的反投影误差,从点云的聚集情况和分散的最⼤范围可以看出反投影误差的⼤⼩。Recomp. corners选项,主要完成根据反向投影得到的⾓点坐标重作为对⾓点的估计,重新计算⾓点的功能。针对第⼀次标定结果误差太⼤的情况,可以通过此⽅法重新计算焦点。计算完成后,点击Calibration根据新的焦点进⾏标定。此时,得到的标定信息,⽐第⼀次得到的反投影误差分布更集中,直径也⼩。(该步骤在标定过程中需谨慎使⽤,因为往往⾸次得到的三维坐标精确度并不⾼,如果参考误差较⼤的话,有可能使结果与正解偏差更⼤。)
3. 两个摄像头的焦距应该保持⼀致,因为在后续的视差图转换为三维图时的Q矩阵只有⼀个f值。所以必须要求⾄少焦距相近。⽽且⽴体成像的三⾓测量(Learning OpenCV书中提到)的前提假设就是fl=fr。(调整两个摄像头的焦距相同的⽅法:离两个相机相同远处放置标定板,分别调节两个相机的焦距,使得两个画⾯的清晰度相似。)
⼆、双⽬校正
要计算⽬标点在左右两个视图上形成的视差,⾸先要把该点在左右视图上两个对应的像点匹配起来。然⽽,在⼆维空间上匹配对应点是⾮常耗时的,为了减少匹配搜索范围,我们可以利⽤极线约束使得对应点的匹配由⼆维搜索降为⼀维搜索。⽽双⽬校正的作⽤就是要把消除畸变后的两幅图像严格地⾏
对应,使得两幅图像的对极线恰好在同⼀⽔平线上,这样⼀幅图像上任意⼀点与其在另⼀幅图像上的对应点就必然具有相同的⾏号,只需在该⾏进⾏⼀维搜索即可匹配到对应点。
经过双⽬标定得到摄像头的各项参数后,采⽤OpenCV中的stereoRectify得到校正旋转矩阵R、投影矩阵P、重投影矩阵Q,再采⽤initUndistortRectifyMap函数得出校准映射参数,然后⽤remap来校准输⼊的左右图像。其中remap的图像剪裁系数alpha,取值范围是-1、0~1。当取值为 0 时,OpenCV会对校正后的图像进⾏缩放和平移,使得remap图像只显⽰有效像素(即去除不规则的边⾓区域),适⽤于机器⼈避障导航等应⽤;当alpha取值为1时,remap图像将显⽰所有原图像中包含的像素,该取值
适⽤于畸变系数极少的⾼端摄像头;alpha取值在0-1之间时,OpenCV按对应⽐例保留原图像的边⾓区域像素。Alpha取值为-1时,OpenCV⾃动进⾏缩放和平移。
⼆、⽴体匹配
采⽤Block Matching算法进⾏⽴体匹配,Block Matching⽤的是SAD⽅法,速度⽐较快,但效果⼀般。
参数设置:
MinDisparity设置为0,因为两个摄像头是前向平⾏放置,相同的物体在左图中⼀定⽐在右图中偏右。如果为了追求更⼤的双⽬重合区域⽽将两个摄像头向内偏转的话,这个参数是需要考虑的。
UniquenessRatio主要可以防⽌误匹配,此参数对于最后的匹配结果是有很⼤的影响。⽴体匹配中,宁愿区域⽆法匹配,也不要误匹配。如果有误匹配的话,碰到障碍检测这种应⽤,就会很⿇烦。该参数不能为负值,⼀般5-15左右的值⽐较合适,int型。
BlockSize:SAD窗⼝⼤⼩,容许范围是[5,255],⼀般应该在 5x5..21x21 之间,参数必须为奇数值, int型。
NumDisparities:视差窗⼝,即最⼤视差值与最⼩视差值之差,窗⼝⼤⼩必须是 16的整数倍,int型。
在BM算法的参数中,对视差⽣成效果影响较⼤的主要参数是BlockSize、NumDisparities和UniquenessRatio三个,⼀般只需对这三个参数进⾏调整,其余参数按默认设置即可。
双⽬测距的原理如下图所⽰。
立体剪裁BM算法计算出的视差disp是CV_16S格式,通过vertTo(disp8, CV_8U, 255/(numberOfDisparities*16.))变换才能得到真实的视差值。
然后通过reprojectImageTo3D这个函数将视差矩阵转换成实际的物理坐标矩阵。在实际求距离时,reprojectImageTo3D出来的X / W, Y / W, Z / W都要乘以16(也就是W除以16),才能得到正确的三维坐标信息。

本文发布于:2024-09-21 21:59:17,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/376727.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:标定   摄像头   匹配   得到   参数   图像   矩阵   视差
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议