结构光3D扫描仪-像素对应的深度图

3

我正在尝试创建结构光三维扫描仪

相机标定

相机标定是OpenCV官方教程的副本。结果,我有了相机内部参数(相机矩阵)。

投影仪标定

投影仪标定可能不正确,但是过程是:投影仪显示棋盘图案,摄像机从不同角度拍摄一些照片。使用相机参数对图像进行cv.undistored,然后使用OpenCV官方教程对结果图像进行校准。结果,我有了投影仪内部参数(投影仪矩阵)。

旋转和平移

cv.calibrate中,我得到旋转和平移向量作为结果,但向量数目与图像数目相同,我认为这不是正确的,因为我在标定时移动了相机和投影仪。我的新想法是在扫描背景上投影棋盘,进行校准,这样我将获得旋转向量平移向量。我不知道这是否是正确的方法。

扫描

扫描过程如下:

生成图案->使用投影仪矩阵对图案进行畸变校正->投影图案并使用相机拍摄照片->使用相机矩阵对拍摄的照片进行畸变校正

相机-投影仪像素映射

我使用GrayCode图案,并使用cv.graycode.getProjPixel,在相机和投影仪之间获得了像素映射。我的投影仪分辨率不是很高,最后的图案不是很清晰。我将创建自定义函数,生成没有最后几个图案的映射。

问题

我不知道如何从所有这些信息中获得深度图Z)。我的困惑在于有3个坐标系-相机、投影仪和世界坐标系。

如何使用代码找到'Z'?我是否可以从图像和图案之间的像素映射中仅获取Z

已有的信息:

  • p(x,y,1) = R*q(x,y,z) + T - 这里p是图像点,q是真实世界的点(可能是三维坐标),RT是旋转向量和平移向量。如何找到RT
  • Z = B.f/(x-x') - 这里Z是深度坐标,B是基线(摄像机和投影仪之间的距离),我可以用手测量它,但这可能不是最好的方法,(x-x')是摄像机像素和投影仪像素之间的距离。我不知道如何得到基线。也许这就是平移向量
  • 我尝试获取4个有意义的点,将它们用在cv.getPerspectiveTransform中,并使用此结果在cv.reprojectImageTo3D中使用。但是cv.getPerspectiveTransform返回3x3矩阵,而cv.reprojectImageTo3D使用Q-4×4透视变换矩阵,可以通过stereoRectify获得。

类似的问题:

  • 如何从结构光3D扫描获取点云数据? - 答案是您需要定义一个向量,该向量从相机透视中心到图像中的像素,并将此向量旋转相机旋转。但我不知道如何定义/找到这个向量,需要旋转向量
  • 如何计算两个摄像机之间的旋转和平移? - 问题是关于两个摄像机之间的R和T,但几乎所有地方都写道投影仪是相机的反向。一个好的答案是您唯一需要做的就是确保校准棋盘由两个摄像机看到。但我认为如果我投影棋盘图案,它将被墙壁额外扭曲(射影变换)。

还有许多其他资源,我会在评论中更新列表。我错过了一些东西,也不知道如何实现它。


1
你知道投影仪参考图像的样子。现在想象一下,如果将投影仪替换为相机,它会看到该参考图像(由于投影仪等的镜头畸变,但与场景3D几何无关)。因此,您可以将整个设置解释为立体成像设置,以立体方式计算视差和3D重建。这可能甚至更容易,但从这个角度来看,理解起来可能更容易。 - Micka
我知道我重复了,但我认为投影的棋盘图像和相机所看到的图像不能用作立体视点。原因是投影会从墙壁上失真。为什么这种失真不重要呢?如果我想象一下有一个真正的棋盘和两个相机,相机(情况1和情况2中的相机)上的结果图像将是不同的。 - Morticia A. Addams
1
从投影仪的角度来看,墙壁不会扭曲图像。 - Micka
1
想象投影仪的液晶屏幕是一个摄像头传感器,然后绘制投影射线。你会发现,无论墙壁看起来如何,投影机射线和投影返回虚拟摄像头传感器都是相同的射线。 - Micka
也许可以研究一下MediaPipeHandTracker如何检测手的z坐标。 - Ann Zen
1个回答

1
假设p(x,y)是图像点,视差为(x-x'),则您可以获得深度点如下:

假设p(x,y)是图像点,视差为(x-x'),那么你可以用以下公式计算出深度点:

disparity = x-x_ # x-x'
point_and_disparity = np.array([[[x, y, disparity]]], dtype=np.float32)

depth = cv2.perspectiveTransform(point_and_disparity, q_matrix)


我怎样才能获得 q_matrixcv.findHomography - Morticia A. Addams
1
您可以通过立体标定获取q矩阵。 - cyborg
1
https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#stereorectify - cyborg
1
这是立体声校准的好参考 https://jayrambhia.com/blog/stereo-calibration - cyborg
stereoRectify使用旋转矩阵平移向量。在参考链接中,RT是从stereoCalibrate得出的结果,但我不确定如果我的第二个相机是投影仪是否可以使用此方法。因为相机和投影仪不能从不同的角度“看到”相同的物体,而棋盘格图案是从扫描仪的背景中投影变换而来的。 - Morticia A. Addams

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