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

整个文章分为以下几部分:
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. java面试常问问题(中级及以下工程师)
  2. 电子计算机说明文作文,电脑事物说明文
  3. 服务器上的电脑登不上oracle,Oracle服务器改计算机名后报错之解决方法
  4. 常用html字符的转义字符串(html代码),全部转义字符备用
  5. 服务器虚拟化的主备,云服务器可以主备切换
  6. 【11】 Express安装入门与模版引擎ejs
  7. 华为云薅羊毛攻略来袭,走过路过不要错过
  8. opencv4.3.0+Visual Studio 2019环境配置
  9. Android Adapter中的getView缓存失效
  10. linux caffe 生成lmdb,Caffe︱构建lmdb数据集与各类文件路径名设置细解
  11. 如何降低less的版本
  12. 2019 ICPC 徐州 H题 Yuuki and a problem
  13. 哈佛图书馆自习室墙上的20条训言(中英文)
  14. 使用8080并口协议驱动NT35510LCD显示屏
  15. ElementUI表格多选数据处理
  16. html网页字体出现模糊,浏览器打开网页字体模糊问题的解决方法
  17. Linux服务器出现方向键、退格键乱码等现象解决
  18. 25岁到30岁的女生还可以长高么? 非药物
  19. Future异步回调详解
  20. 《精通Tableau商业数据分析与可视化》之序言

热门文章

  1. MongoDB文档的CRUD
  2. 【区块链 | ENS】ENS如何接入DNS?ENS智能合约如何验证DNS所有权?DNS注册器介绍?
  3. 【zabbix】MySQL模板创建与监控
  4. 微型计算机原理与应用田瑞庭,微型计算机原理及应用[一]教学大纲.doc
  5. new unsigned char 什么意思
  6. ThickBox 3.1参数详解
  7. 学习python的第三天
  8. 终于等到有学生来答疑了
  9. oracle check更改,Oracle With Check Option
  10. 通过ajax将数组或list集合传到后台的方法