7

我尝试构建一个结构光环境来进行 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 的模式?否则格雷码不可用?

4

1 回答 1

3

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

因为它会扭曲模式使其无用

相反,您可以:

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

    但是您也需要在扫描部分处理它,因为您没有可用的完整模式

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

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

  3. 使用子弹 #2 + 放大以更好地适应您的分辨率

    所以创建图案512x256并线性缩放以800x480尽可能多地适应:

    800/512 = 1.5625
    480/256 = 1.8750
    

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

    800x400

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

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

// [generate pattern xs*ys power of 2 resolution]
// clear buffer
bmp->Canvas->Brush->Color=clBlack;
bmp->Canvas->FillRect(TRect(0,0,xs,ys));
int x,y,a,da;
for (da=0;1<<da<xs;da++);                   // number of bits per x resolution
for (a=0,y=0;y<ys;y++,a=(y*da)/ys)
 for (x=0;x<xs;x++)
  if (int((x>>a)&1)==0) pyx[ys-1-y][x]=0x00FFFFFF;
bmp->SaveToFile("3D_scann_pattern0.bmp");
  • bmp是 VCL 位图
  • xs,ys是位图的分辨率
  • p[ys][xs]是直接32位像素访问位图

这与您的模式略有不同!

[笔记]

  • 如果您需要精确使用子弹 #2
  • 如果您需要覆盖更大的区域,请使用子弹 #3
  • 您还可以在y轴上进行不同的缩放,然后在x轴上进行缩放,因为这只是一维编码
于 2015-08-04T06:37:02.390 回答