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

Structured-light 3D scanner - depth map from pixel correspondence

我尝试创建 Structured-light 3D scanner

相机校准

相机校准是OpenCV official tutorial的副本。结果我有相机内在参数(camera matrix)。

投影仪校准

投影仪校准可能不正确,但过程是:投影仪显示棋盘图案,相机从不同角度拍摄一些照片。图像 cv.undistored 带有相机参数,然后结果图像用于 OpenCV official tutorial 的校准。结果我有投影仪内在参数(projector matrix)。

旋转和过渡

来自 cv.calibrate 我有旋转和过渡向量作为结果,但向量数等于图像数,我认为它不是正确的,因为我在校准中移动相机和投影仪。 我的新想法是将棋盘投影到扫描背景上,进行校准,这样我就有了Rotation vectorTransition vector。我不知道那是正确的方法。

正在扫描

扫描过程为:

生成图案 -> 使用 projector matrix 取消扭曲图案 -> 投影图案并使用相机拍照 -> 使用 camera matrix

取消扭曲拍摄的照片

相机-投影仪像素图

我使用 GrayCode 模式并使用 cv.graycode.getProjPixel,并且在相机和投影仪之间有 pixels mapping。我的投影仪分辨率不是很高,最后的图案也不是很可读。我将创建自定义函数来生成没有最后模式的映射。

问题

我不知道如何从所有这些信息中得到 depth map(Z)。我的困惑是因为有 3 个坐标系 - 相机、投影仪和世界坐标系。

如何用代码查找'Z'?我可以只从图像和图案之间的 pixels mapping 得到 Z 吗?

信息有:

类似问题:

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

假设 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)