【问题标题】:Structured-light 3D scanner - depth map from pixel correspondence结构光 3D 扫描仪 - 来自像素对应的深度图
【发布时间】:2022-02-24 20:17:06
【问题描述】:

我尝试创建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,1) = R*q(x,y,z) + T - 其中p 是图像点,q 是真实世界点(可能),R 和 @987654348 @ 是旋转向量和过渡向量。如何找到RT
  • Z = B.f/(x-x') - 其中Z 是坐标(深度),B-baseline(相机和投影仪之间的距离)我可以手动测量它,但也许不是这样, (x-x') - 相机像素和投影仪像素之间的距离。我不知道如何获得基线。也许这是Transition vector
  • 我试图得到4个意义点,在cv.getPerspectiveTransform中使用它们,这个结果将在cv.reprojectImageTo3D中使用。但是cv.getPerspectiveTransform 返回 3x3 矩阵,cv.reprojectImageTo3D 使用 Q-4×4 perspective transformation matrix that can be obtained with stereoRectify

类似问题:

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

【问题讨论】:

  • 您知道投影仪参考图像的外观。如果您现在将投影仪想象为相机,它会看到该参考图像(投影仪等具有一些镜头失真,但独立于场景 3D 几何图形)。因此,您可以将整个设置解释为立体成像设置,以立体方式计算视差和 3D 重建。它可能更容易,但这样看可能很容易理解。
  • 我知道我在重复自己,但我认为投射的棋盘图像和相机看到的东西不能用作立体视点。原因是投影将是distorted from wall。为什么这种失真没有发生?如果我想象有真正的棋盘和两个相机,相机上的结果图像(案例 1 和案例 2 中的相机)会有所不同。
  • 从投影仪的角度来看,墙壁不会扭曲图像。
  • 将投影仪的液晶屏想象成一个摄像头传感器并绘制投影光线。你会看到无论墙壁看起来如何,投影光线和投射回假想相机传感器的光线都是相同的光线。
  • 也许研究一下 MediaPipeHandTracker 如何检测手的 z 坐标。

标签: python opencv 3d camera-calibration scanning


【解决方案1】:

假设 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?
  • 可以通过立体校准得到q矩阵。
  • 这是很好的立体校准参考jayrambhia.com/blog/stereo-calibration
  • stereoRectify 使用 Rotation matrixTranslation vector。在参考链接中RTstereoCalibrate 的结果,但如果我的第二台相机是投影仪,我不确定我是否可以使用此方法。因为相机和投影仪不会从不同的角度“看到”同一个物体,而棋盘图案是从扫描仪的背景转换而来的投影。
猜你喜欢
  • 2018-06-23
  • 2010-09-21
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 2011-02-07
  • 1970-01-01
相关资源
最近更新 更多