结构光 - 当投影机的分辨率低于模式时如何操作?

APU*_*APU 7 algorithm 3d image-processing computer-vision gray-code

我尝试构建一个结构化的光环境来进行3D扫描.

据我所知,如果我选择使用格雷码来重建3D模型,我必须实现在幂2(2 ^ x,x = 0~10)中编码的特定模式.

在此输入图像描述

也就是说,模式的分辨率必须至少为1024 x 1024.

如果我的DLP投影机仅支持高达800 x 480的分辨率怎么办?当灰色代码模式分辨率变得太高时,它会投射莫尔图案(我试过).我该怎么办?

我的朋友们建议我创建1024 x 1024个图案,并将它们"裁剪"成800 x 480,

但是我认为灰色代码应该遵循特定的顺序和模式,我的朋友建议会创建几个不对称的图像.

有没有人像我一样拥有相同的经历?

---------- 2015.8.4更新问题----------

我想如果我的投影机无法完美地投射高分辨率图案,我可以让它以低分辨率投影图案,例如,从2 ^ 0到2 ^ 6?

或者格雷码严格要求从2 ^ 0到2 ^ 10的模式?否则灰色代码不可用?

Spe*_*tre 3

你不能直接缩小到你的分辨率

因为它会扭曲图案使其变得毫无用处

相反,你可以:

  1. 将其裁剪为您的分辨率

    但您也需要在扫描部分处理这个问题,因为您没有可用的完整图案

  2. 使用最接近的 2 分辨率的可用幂

    喜欢512x256并为其创建模式。其余空间未使用(浪费像素) 512x256

  3. 使用项目符号 #2 + 放大以更好地适应您的分辨率

    因此,创建图案512x256并线性缩放以800x480尽可能适合:

    800/512 = 1.5625
    480/256 = 1.8750
    
    Run Code Online (Sandbox Code Playgroud)

    使用较小的比例 ( 512x256 * 1.5625 -> 800x400),因此缩放图案并将1.5625其用作图案图像

    800x400

    这是按最近邻缩放的,以避免难以检测的子像素灰度颜色。这会浪费更少的像素,但会降低 3D 扫描的精度!

这就是我在 C++ 和 VCL 中生成模式的方式:

800/512 = 1.5625
480/256 = 1.8750
Run Code Online (Sandbox Code Playgroud)
  • bmp是VCL位图
  • xs,ys是位图的分辨率
  • p[ys][xs]是直接32位像素访问位图

这与您的模式编码略有不同!

[笔记]

  • 如果您需要精确度,请使用项目符号 #2
  • 如果您需要覆盖更大的区域,请使用项目符号 #3
  • 您还可以在轴上进行y不同的缩放x,因为这只是一维编码