之前一直在做关于格雷码+相移的相位展开方法,根据一些相应的论文,能够对该法进行一些较为详细的阐述,并融合一些自己的理解,文章中如有不妥之处,敬请指教。

整个文章分为以下几部分:
1、格雷码+相移法基本原理
2、格雷码条纹生成
3、格雷码条纹解码
4、确保相移正确展开的措施(补码)。


1、格雷码+相移法基本原理

格雷码+相移法是将相移技术和二元编码光栅相结合的时间相位展开方法。其中相移法是计算相位的主值,格雷码解码后作为相位展开的级次,此时投影相位就能唯一的展开。该方法中使用格雷码来提供级次具有抗环境噪声干扰强,相比二进制码明暗交界处变换更少(明暗交界处容易判断二值出错),高位条纹更宽(条纹越宽越不容易模糊)等优点,能够有效提供出正确的展开级次。

格雷码+相移的方法比条纹降级法的好处在于,降级法必须要从1频条纹进行投影,一级一级展开后单频的噪声对最终的归一化相位噪声影响最大,而投影格雷码的环境噪声远小于二值化阈值,具有较强的抑制噪声的能力,对最终的归一化相位噪声影响几乎为0,那么相对的重建效果要好的多。

那么如何选择正确的格雷码位数、相移周期及步数呢,这些参数的选择直接决定了最终归一化相位精度、获得一幅相位的速率(总图片张数);一般的,格雷码的位数与相移的条纹周期之间选择存在着一个规则(假设投影仪的横向分辨率是1024个像素,如果选择6位格雷码pow(2,6)=64级次,那么意味着相移条纹也要选择64根条纹的图像,相移条纹周期是16Pixel);该规则表示相移周期与格雷码位数必须统一,那么此时决定格雷码位数的就是所需的包裹相位精度(由相移步数与周期决定),但是格雷码的位数也不能选择过高,否则极易受噪声影响,后续解码错误,影响重建效果。那么最佳的相位精度条纹编码请参考详细描述。

以下是格雷码+相移的相位展开过程:

2、格雷码条纹生成

格雷码是一个数列集合,每个数都使用二进制来表示,并且任两个数之间只有一个位不同,N位元表示2N\ 2^N\, 2N个数列,每个数列有N位二进制数。

一、按格雷码特殊方式生成

以4位的格雷码条纹为准,格雷码的生成是有规律的,我们发现格雷码条纹的每位元是严格的左右对称的,除第一行外,其他都是以0110进行循环的:

那么,按照此规律,格雷码的生成代码可写成:

CamW = 1024; //像素分辨率
Nbit = 6;  //所要生成的位数
I = zeros(CamW, Nbit); //从1到Nbit的格雷码存储空间
bit = [0 1 1 0];
for i = 3:Nbit bit  = [bit bit];
end
for i = 1:Nbitfor j = 1:2^ibeg = 1 + CamW/(2^i)*(j-1);       I(beg:beg-1+CamW/(2^i), i) = bit(j);end
end

上述代码表示先把Nbit的格雷码循环生成,然后再把01放到指定的位置上。
该方法简单且好理解,充分利用了格雷码条纹的规律。

3、格雷码条纹解码

格雷码条纹主要是将被调制过的信息解码出来,经过二值化(根据灰度阈值,判断明暗变化条纹的01)、依次异或(使用该格雷码与次一级的格雷码进行异或操作,数值保留在当前格雷码位置)、数值展开等操作;

之后在按照二值进行数值的展开。

4、确保相移正确展开的措施(补码)

传统的用于相位展开的二元光栅是根据格雷码的编码设计的,编码图像中的某一点最多只会出现在一副编码图的黑白交界处,虽然最多只会导致一位错码,然而用于相位展开将引入2pi的相位误差

该处提出的补码光栅也是按照格雷码的编码原则实现的,是在原先编码光栅最后一副光栅的基础上再增加一倍码字,其解决思路是两种编码出现误码的位置不同,在相位展开时根据截断相位的不同,利用编码的互补性,采用不同的解码方式来恢复真实相位。

不失一般性, 为便于说明令相移光栅的周期数为 8, 互补型二元光栅的编码方式如图所示, k1 是对前三幅编码光栅所产生的码字进行的编码, k2 是对四幅编码光栅所产生的码字进行的编码。由图可得, 在 k1 可能出现误码的位置( 椭圆处), 在 k2 中不会出现误码。

上述补码表述来自"基于互补型光栅编码的相位展开"论文中所述;

下面附上解格雷码+补码的C++代码,有需要可以参考。

float *pha = new float[IMAGE_HEIGHT*IMAGE_WIDTH];
int Gcode;
int Bcode[7];
int *NLevel = new int[IMAGE_HEIGHT*IMAGE_WIDTH];
int *NLevel2 = new int[IMAGE_HEIGHT*IMAGE_WIDTH];for(int i=0; i<IMAGE_WIDTH*IMAGE_HEIGHT; i++)
{for(int n=0; n<7; n++){if(Img[n][i] > I[i])Gcode = 1;elseGcode = 0;if(n == 0)   Bcode[n] = Gcode;elseBcode[n] = Bcode[n - 1]!=Gcode;        }NLevel[i] = Bcode[0] * 32 + Bcode[1] * 16 + Bcode[2] * 8 + Bcode[3] * 4 + Bcode[4] * 2 + Bcode[5];NLevel2[i] = NLevel[i] + Bcode[6];if(pha[i] <= pi/2)Phase[i] = pha[i] + NLevel2[i]*2*pi;else if(pha[i] >= 3*pi/2)Phase[i] = pha[i] + (NLevel2[i] - 1)*2*pi;elsePhase[i] = pha[i] + NLevel[i]*2*pi;
}

【结构光三维重建】基于格雷码的相位展开方法(含代码)相关推荐

  1. 三维重建【四】-------------------结构光 三维重建----论文调研

    1. 动态目标实时三维重建-结构光方案 动态目标 三维重建 Stripe boundary codes for real-time structured-light range scanning of ...

  2. 【视觉-结构光三维重建-理论篇】结构光 三维重建----论文调研3

    动态目标实时三维重建-结构光方案 动态目标 三维重建 Stripe boundary codes for real-time structured-light range scanning of mo ...

  3. [结构光三维重建] 2、基于结构光的三维重建系统工作原理总结

    概念 基于结构光三维重建系统模型,如下图所示: 基于结构光的三维成像,实际上是三维参数的测量与重现,需要主动去投射结构光到被测物体上,通过结构光的变形来确定被测物的尺寸参数,是一种主动三维测量方式. ...

  4. 结构光三维重建之单目标定的一种方法——建立“相位-像点-真实三维坐标”之间的关系

    结构光三维重建之单目标定的一种方法--建立"相位-像点-真实三维坐标"之间的关系 1.目的 为了让像我一样刚接触结构光三维扫描的朋友们能更快速地理解整个框架,我先介绍一下写作本文的 ...

  5. 重磅直播|基于格雷码结合相移技术的高鲁棒性高效率动态三维面形测量

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 大家好,本公众号现已开启线上视频公开课,主讲人通过B站直播间,对3D视觉领域相关知识点进行讲解,并在微 ...

  6. 重磅直播|计算深度分割技术的实现与全局效应下的结构光三维重建

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 大家好,本公众号现已开启线上视频公开课,主讲人通过B站直播间,对3D视觉领域相关知识点进行讲解,并在微 ...

  7. 直播回顾|基于格雷码结合相移技术的高鲁棒性高效率动态三维面形测量

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 大家好,本公众号现已开启线上视频公开课,主讲人通过B站直播间(bilibili号:3D视觉工坊:htt ...

  8. 结构光三维重建基本原理

    点击进入->3D视觉工坊学习交流群 结构光三维重建系统是由一个相机和一个投影仪组成,关于结构光三维重建系统的理论有很多,其中有一个简单的模型是把投影仪看做相机来使用,从而得到物体的三维信息.接下 ...

  9. 双目三维重建_系列篇|结构光三维重建基本原理

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 结构光三维重建系统是由一个相机和一个投影仪组成,关于结构光三维重建系统的理论有很多,其中有一个简单的模 ...

最新文章

  1. 程序员的十大谎言,你中了几个? | 每日趣闻
  2. 【原创】设置头文件路径, gcc -I 选项写法
  3. tomcat使用说明
  4. Prism For WPF Login对话框又简单又合理的方案之一
  5. Linux的sort命令用法
  6. crontab 日志_聊聊老板让我删除日志文件那些事儿
  7. 转:TC35/TC35I/MC35I短信AT指令实例
  8. c语言中最常用的四种数据类型,计算机中有哪几种常见数据类型
  9. Java强制删除java程序占用的文件
  10. 新中大 金蝶 用友产品技术比较
  11. 记某单机游戏的一次内购破解
  12. 云计算产业分析及企业级laaS建设探讨
  13. [BZOJ1921] [CTSC2010]珠宝商
  14. Android仿微信通讯录
  15. 《web前端面试题》第一问-如何快速居中对齐?
  16. UCenter Home
  17. 麦德龙中国正式引进高品质法国牛肉
  18. 如何安装husky_利用huskylint-staged构建代码检查工作流
  19. 山寨手机平台斯凯网络
  20. 实体识别入门代码实战

热门文章

  1. 全球及中国类胡萝卜素行业研究及十四五规划分析报告
  2. android usb转串口数据通信示例
  3. linuxmint20.1 wine QQ不显示图片问题解决办法
  4. 一、Java基础(6)
  5. DropDownList中SelectedIndexChanged事件失效的解决方法
  6. 【Vmware】虚拟机 | 网络配置 | ip配置
  7. 离线打包maven设置
  8. 计算机和城轨学哪个好,地铁、城轨、轻轨三者有什么区别?
  9. java后端面试题总结(持续更新)
  10. Libpcap二 libpcap抓包基本流程