结构光 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 vector
和Transition vector
。我不知道那是正确的方法。
正在扫描
扫描过程为:
生成图案 -> 使用 projector matrix
取消扭曲图案 -> 投影图案并使用相机拍照 -> 使用 camera matrix
取消扭曲拍摄的照片
相机-投影仪像素图
我使用 GrayCode 模式并使用 cv.graycode.getProjPixel,并且在相机和投影仪之间有 pixels mapping
。我的投影仪分辨率不是很高,最后的图案也不是很可读。我将创建自定义函数来生成没有最后模式的映射。
问题
我不知道如何从所有这些信息中得到 depth map
(Z
)。我的困惑是因为有 3 个坐标系 - 相机、投影仪和世界坐标系。
如何用代码查找'Z'?我可以只从图像和图案之间的 pixels mapping
得到 Z
吗?
信息有:
- p(x,y,1) = R*q(x,y,z) + T - 其中
p
是图像点,q
是现实世界点(可能), R
和T
是旋转向量和过渡向量。如何找到 R
和 T
?
- Z = B.f/(x-x') - 其中
Z
是坐标(深度),B
-基线(相机和投影仪之间的距离)我可以测量它手动但也许不是这样,(x-x')
- 相机像素和投影仪像素之间的距离。我不知道如何获得基线。也许这是 Transition vector
?
- 我试着得到4个意义点,用在cv.getPerspectiveTransform and this result to be used in cv.reprojectImageTo3D. But
cv.getPerspectiveTransform
return 3x3 matrix and cv.reprojectImageTo3D
use Q-4×4 perspective transformation matrix that can be obtained with
stereoRectify中。
类似问题:
- How is point cloud data acquired from the structured light 3D scanning? - 答案是
you need to define a vector that goes from the camera perspective center to the pixel in the image and then rotate this vector by the camera rotation
。但我不知道如何 define/find thid vercor 和 Rotation vector
是必需的。
- How to compute the rotation and translation between 2 cameras? - Question is about R and T between two cameras but almost everywhere writes that projector is inverse camera. One good answer is
The only thing you have to do is to make sure that the calibration chessboard is seen by both of the cameras.
But I think if I project chessboard pattern it will be additional distored by wall(Projective transormation)
还有很多其他资源,我会用评论更新列表。我错过了一些东西,我不知道如何实现它。
假设 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)
我尝试创建 Structured-light 3D scanner。
相机校准
相机校准是OpenCV official tutorial的副本。结果我有相机内在参数(camera matrix
)。
投影仪校准
投影仪校准可能不正确,但过程是:投影仪显示棋盘图案,相机从不同角度拍摄一些照片。图像 cv.undistored 带有相机参数,然后结果图像用于 OpenCV official tutorial 的校准。结果我有投影仪内在参数(projector matrix
)。
旋转和过渡
来自 cv.calibrate
我有旋转和过渡向量作为结果,但向量数等于图像数,我认为它不是正确的,因为我在校准中移动相机和投影仪。
我的新想法是将棋盘投影到扫描背景上,进行校准,这样我就有了Rotation vector
和Transition vector
。我不知道那是正确的方法。
正在扫描
扫描过程为:
生成图案 -> 使用 projector matrix
取消扭曲图案 -> 投影图案并使用相机拍照 -> 使用 camera matrix
相机-投影仪像素图
我使用 GrayCode 模式并使用 cv.graycode.getProjPixel,并且在相机和投影仪之间有 pixels mapping
。我的投影仪分辨率不是很高,最后的图案也不是很可读。我将创建自定义函数来生成没有最后模式的映射。
问题
我不知道如何从所有这些信息中得到 depth map
(Z
)。我的困惑是因为有 3 个坐标系 - 相机、投影仪和世界坐标系。
如何用代码查找'Z'?我可以只从图像和图案之间的 pixels mapping
得到 Z
吗?
信息有:
- p(x,y,1) = R*q(x,y,z) + T - 其中
p
是图像点,q
是现实世界点(可能),R
和T
是旋转向量和过渡向量。如何找到R
和T
? - Z = B.f/(x-x') - 其中
Z
是坐标(深度),B
-基线(相机和投影仪之间的距离)我可以测量它手动但也许不是这样,(x-x')
- 相机像素和投影仪像素之间的距离。我不知道如何获得基线。也许这是Transition vector
? - 我试着得到4个意义点,用在cv.getPerspectiveTransform and this result to be used in cv.reprojectImageTo3D. But
cv.getPerspectiveTransform
return 3x3 matrix andcv.reprojectImageTo3D
useQ-4×4 perspective transformation matrix that can be obtained with
stereoRectify中。
类似问题:
- How is point cloud data acquired from the structured light 3D scanning? - 答案是
you need to define a vector that goes from the camera perspective center to the pixel in the image and then rotate this vector by the camera rotation
。但我不知道如何 define/find thid vercor 和Rotation vector
是必需的。 - How to compute the rotation and translation between 2 cameras? - Question is about R and T between two cameras but almost everywhere writes that projector is inverse camera. One good answer is
The only thing you have to do is to make sure that the calibration chessboard is seen by both of the cameras.
But I think if I project chessboard pattern it will be additional distored by wall(Projective transormation)
还有很多其他资源,我会用评论更新列表。我错过了一些东西,我不知道如何实现它。
假设 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)