双目测距、重构(基于MATLAB和opencv-python)

双目测距、重构

楼主之前用的SFM来进行重构,但是得到的是视差图,点云和实物存在比例关系,单目的还是不能解决scale这个问题的。所以今天用双目的来进行重构,期间遇到了很多坑,实属难受。

楼主自己版本的代码:Github的代码

双目测距过程大致可以分为,标定,图像校正,计算视差,测距,知道这个流程,目标就很明确了

标定

opencv和matlab都有标定的代码,但是老师说还是matlab的标定更加准确,自己试验下来也的确感受到matlab标定更加稳定和精准。matlab立体标定的流程网上很多,就不多赘述了,这里只说下matlab得到的标定数据怎么转换为opencv可用的数据,两个数据存放的形式是不一样的,要是这里不避雷后面等于白做。

先上代码:opencv-python部分测距代码 参考源码
但是这里他没有说到这个数据关系,这不是坑人吗?

  • IntrinsicMatrix 内参,matlab和opencv的两个矩阵是转置的关系
  • RadialDistortion 为 径向畸变,摄像头由于光学透镜的特性使得成像存在着径向畸变,可由K1,K2,K3确定。
    TangentialDistortion 为 切向畸变,由于装配方面的误差,传感器与光学镜头之间并非完全平行,因此成像存在切向畸变,可由两个参数P1,P2确定。
    opencv这个的参数的排放顺序,即K1,K2,P1,P2,K3
    附上matlab官网关于这两个系数的描述 https://ww2.mathworks.cn/help/vision/ref/cameraintrinsics.html?searchHighlight=RadialDistortion&s_tid=doc_srchtitle
  • RotationOfCamera2 相机二相对于相机一的转换矩阵,相对 opencv ,也是需要转置转化的

明确opencv和matlab系数的转换关系之后就可以进行下一步的工作了

校正和测距

前面花了这么大的功夫就是为了先将图片进行校正处理,其实这一步也可以交给matlab先左处理,得到校正后的图片再进行视差图的测距,然而其实matlab也有完整双目测距的代码,但是不知道底层的代码算法写的有什么问题,做出来的效果真的是不好。
原图和视差图效果:

双目测距、重构(基于MATLAB和opencv-python)_第1张图片
双目测距、重构(基于MATLAB和opencv-python)_第2张图片
但是最后使用cv2.reprojectImageTo3D出来的效果不太行,很明显,我没有两个一样的相机

关于参数:
cv2.stereoRectify() 参数详解
cv2.StereoBM_create() 参数详解
cv2.reprojectImageTo3D() 参数详解

参考汇总:(非常感激!)
https://blog.csdn.net/qq_32951799/article/details/83090855

你可能感兴趣的:(计算机视觉)