1

我有两个图像(都是完全相同的图像),我正在尝试使用平方距离和重建 3D 空间中的差异来计算它们之间的差异。在计算视差之前是否需要校正图像?

以下是我迄今为止为视差图计算所做的步骤(我尝试过校正和不校正,但两者都返回全零视差矩阵)。

For each pixel in the left image X, 
   Take the pixels in the same row in the right image.
   Separate the row in right image to windows.
   For each window,
     Calculate the disparity for each pixel in that window with X
     Select the pixel in the window which gives minimum SSD with X
   Find the pixel with minimum disparity among all windows as the best match to X

我做得对吗?

如何在matlab中将视差的3D重建可视化为散点图?

4

2 回答 2

2

校正保证在同一行中找到匹配项(对于水平分离的相机)。如果您对图像的校正有疑问,可以尝试通过在水平分离的图像之间绘制水平线来比较行。如果线条达到相同的特征,你很好,请参见下图,其中图像未纠正。它们失真的事实意味着进行了镜头失真校正以及尝试(但实际上未正确执行)校正。

现在,让我们看看您所说的相同图像是什么意思。您是指从不同视点拍摄的同一物体的图像吗?请注意,如果图像实际上是相同的(相同的视点),则差异将为零,如另一个答案中所述。视差的定义(对于水平分离的相机)是匹配特征之间的偏移值(在同一行中)。视差与深度有关(如果相机的光轴平行),因为视差 d=f*B/z,其中 z - 深度,B - 基线或相机之间的间距,f 是焦距。您可以将上面的公式转换为 disparity/B=f/z,这基本上表示与相机分离相关的视差,因为焦距与距离有关。换句话说,水平和距离测量的比率是相等的。

在此处输入图像描述

如果您的图像是在相机水平移动的情况下拍摄的,则视差(在简单的相关算法中)通常在 5 个嵌入式循环中计算:

loop over image1 y  
   loop over image1 x  
      loop over disparity d  
         loop over correlation window y  
            loop over correlation window x  

视差或 D_best 为您提供了 image1 和 image2 之间所有可能的 d 值的最佳匹配窗口。最后,散点图适用于 3D 点云,而视差可以可视化为热色图。如果您需要可视化 3D 重建或简单地说 3D 点云计算 X、Y、Z 为:Z=f B/D,X=u Z/f,Y=v*Z/f,其中 u 和 v 相关将 wxh 图像的列和行设为 u=col-w/2 和 v=h/2-row,即 u,v 形成一个以图像为中心的坐标系。

于 2014-04-03T06:30:08.983 回答
0

如果您的两个图像完全相同,则每个像素的差异将为 0。您要么必须使用两个单独的相机来拍摄图像,要么使用单个相机从两个不同的位置拍摄它们。进行 3D 重建的最佳方法是使用校准的立体相机对。这是一个如何使用 MATLAB 计算机视觉系统工具箱执行此操作的示例。

于 2014-04-02T21:01:33.420 回答