我有一个图像的视差图。我需要将它转换为一组3D点和法线。我怎么能这样做,是否有任何这样的现有实现可以做到这一点
答案 0 :(得分:7)
看一下这个OpenCV函数:http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#reprojectimageto3d
答案 1 :(得分:1)
当我在我有深度图之前(或者你喜欢的视差图)并且 - 知道原始相机校准 - 之后我已经完成了这一点,并且能够将这些重新投影重新投射到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。
我有图像
的视差图
图像的视差图通常是完全平坦的......