将视差图转换为3D点

时间:2011-02-01 03:22:36

标签: opencv computer-vision

我有一个图像的视差图。我需要将它转换为一组3D点和法线。我怎么能这样做,是否有任何这样的现有实现可以做到这一点

5 个答案:

答案 0 :(得分:7)

答案 1 :(得分:1)

Gnu Triangulated Surface库?

当我在我有深度图之前(或者你喜欢的视差图)并且 - 知道原始相机校准 - 之后我已经完成了这一点,并且能够将这些重新投影重新投射到R3中。

知道每个点的邻域(通过它们原始的相邻像素)然后创建一个基本的三角测量来连接它们是非常简单的。

(如果您不知道这一点,您将不得不尝试某种形式的Delaunay三角剖分或其他更高级的算法......)

确保为每个三角形确定正确的顶点顺序,以确保所有法线指向正确的方式/一致。

Meshlab对任何其他后期处理都非常方便。

答案 2 :(得分:1)

        cvFindStereoCorrespondenceBM( frame1r, frame2r, disp, BMState);

        /*      cvShowImage("camera1", frame1);
                cvShowImage("camera2", frame2);         */      
        //      cvConvertScale( disp, disp, 16, 0 );
                cvNormalize( disp, vdisp, 0, 256, CV_MINMAX );                   
                cvShowImage( "disparity", vdisp );              
                cvReprojectImageTo3D(disp, Image3D, &_Q);               
                cvShowImage("depthmap",Image3D);

这段代码片段对我有所帮助。这里的代码解释如下:当我纠正左右相机的图像并定义BMstate时,我将其传递到cvFindStereoCorrespondenceBM以找到视差图像。接下来定义维度3的矩阵以将3D点存储为Image3D。通过opencv cvReprojectImageTo3D中的函数传递我们在立体对应中获得的Q矩阵,我们获得对应于该2D图像的3D点集

答案 3 :(得分:0)

 @ here is calculation which may help  you 

  % %Z = fB/d
  % where
  % Z = distance along the camera Z axis
  % f = focal length (in pixels)
  % B = baseline (in metres)
  % d = disparity (in pixels) 
  % % After Z is determined, X and Y can be calculated using the usual projective         camera equations:
 % 
  % X = uZ/f
  % Y = vZ/f

 % where
 % u and v are the pixel location in the 2D image
 % X, Y, Z is the real 3d position

  % Note: u and v are not the same as row and column. You must account for the image   center. You can get the image center using the triclopsGetImageCenter() function. Then you find u and v by:

  % u = col - centerCol
  % v = row - centerRow

  % Note: If u, v, f, and d are all in pixels and X,Y,Z are all in the meters, the units will always work i.e. pixel/pixel = no-unit-ratio = m/m.

答案 4 :(得分:-3)

视差图给出x,y和f(z)。您需要相机校准才能知道如何将视差转换为z。

  

我有图像

的视差图

图像的视差图通常是完全平坦的......