立体视觉:深度估计

9

我正在处理立体视觉任务,希望能够得到双目摄像机与物体之间的距离。我使用的是带有计算机视觉系统工具箱的Matlab。
我使用了“Matlab相机标定工具箱”对相机进行了校准,因此我有左右相机的内参和外参参数(右相机相对于左相机的位置)。我还有一对矫正图片及其视差图。为了估算视差,我使用了Matlab函数disparity()。我知道相机的基线和焦距,但我的结果仍然不正确。

baseline = 70 mm
focal length = 25 mm
disparity = 60 pixels
---------------------
depth = baseline * focal length / disparity = 70 * 25 / 60 = 29 mm

我知道距离大约是600毫米。这个公式正确吗?单位怎么样?毫米 * 毫米 / 像素 != 毫米。我特别想使用相机矩阵(内部参数)进行计算,但我还没有弄清楚如何操作。非常感谢任何提示。

1个回答

8

就像您所说的那样,您需要将单位转换为毫米。为此,您需要使用以下公式:

z = (b*F) / (d*s)

mm = (mm * mm) / (pixel * (mm/pixel)) 

这里是关于IT技术的翻译:

  • z = 深度(单位:毫米)
  • b = 基线(单位:毫米)
  • F = 焦距(单位:毫米)
  • d = 深度(单位:像素)
  • s = 传感器尺寸(单位:毫米/像素)。通常以微米为单位,因此需要在使用前进行转换。

编辑

有时您的焦距是以像素为单位的,因此您不需要使用传感器尺寸。因此,只需使用以下公式:

z = b*F / d
mm = mm * pixel / pixel

注意你的括号,你是想表示 z = b*F/d*s 还是 z = b*F / (d*s) - Rody Oldenhuis
谢谢@Alexandre,这部分问题已经解决了,但不幸的是结果并不理想。因为我对基线、焦距和像素大小很确定,所以视差估计可能不太准确。请问您知道如何将相机矩阵应用到这个计算中吗? - PrincAm
@PrincAm 我认为你在寻找的是:单应性。这篇文章对此有所解释,但建议你继续搜索以获取更多信息。另外,也许你的视差图不够好,你可以看一下它的效果如何。 - Vuwox
@PrincAm 你是对的。单元格大小指的是像素在微米中的大小。因此,你有一个0.00345毫米/像素的单元格。 - Vuwox
1
@Alexandre 非常感谢您的帮助。最终我使用了不同的场景,这更加准确。我使用了Caltech的Matlab相机校准工具箱来校准一对摄像头。该工具箱内置有图像矫正和立体三角测量函数。计算基于从工具箱导出的内部和外部参数,因此结果更加精确。 - PrincAm
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接