matlab中两个相似图像的视差计算

时间:2014-04-02 20:08:27

标签: matlab 3d computer-vision matlab-cvst disparity-mapping

我有两个图像(两个图像完全相同),我试图使用平方距离和在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中将视差的三维重建可视化为散点图?

2 个答案:

答案 0 :(得分:2)

整流保证匹配可以在同一行中找到(对于水平分离的摄像机)。如果您对图像的修正有疑问,可以尝试通过在水平分离的图像之间绘制水平线来比较行。如果线条击中相同的功能你没问题,请参见下图中没有修正图像的图片。它们失真的事实意味着存在镜头失真校正以及尝试(但实际上没有正确执行)校正。

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

enter image description here

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

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

Disparity,或D_best,在d的所有可能值之间为您提供image1和image2之间的最佳匹配窗口。最后,散点图用于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形成以图像为中心的坐标系。

答案 1 :(得分:0)

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