天天看点

格雷码结构光(用于立体视觉)原理详解+结构光编码实现

最近疫情闹得厉害,在家看剧看腻了,开始看论文换换脑子。

前段时间在研究格雷码结构光。但是博客上讲格雷码原理的文章几乎没有。最近看文献,总结了一下。如果读者朋友有更好的格雷码文章,请发给我,不胜感激。

格雷码结构光(用于立体视觉)原理详解+结构光编码实现

一、时域编码

即编码一系列的结构光图案,依次投射到目标物体上。首先需要生成一系列编码图案。编码图案随着投射时间的推进而变化,并且这一系列的图案需要全部依次投影,以确保每一个像素对应的码是唯一的。

时域图案编码信息的方式有很多,常见的包括二进制码(binary code)和格雷码(gray code)。两种方法都需要分别编码X轴、Y轴方向。

二、二进制码(Binary Code)

上面说到时域结构光编码需要对行、列分别进行。对某一个像素点来说,二进制码即,将该像素点所在的行数m,列数n转换成二进制,二进制的每一位编码到每一幅pattern中该像素点对应的位置。(即,m转换成二进制数,该二进制数最终的位数等于行的pattern数)。以像素点(209,660)为例,其转换成二进制为(0011010001,1010010100)

该像素点的编码为:图表示在一系列的pattern中,该像素点处的值。

格雷码结构光(用于立体视觉)原理详解+结构光编码实现

上面的是以单个像素点举例,整个pattern系列长什么样呢,以分辨率为32*32的投影仪为例,按照上述编码方式,得到一系列pattern:

格雷码结构光(用于立体视觉)原理详解+结构光编码实现

将以上编码图案依次投射到被测物体上,使得每一个像素点最终的码值都是唯一的。

三、格雷码(Gray Code)

格雷码与二进制码最大的不同是:格雷码相邻的两个像素点的码值,只有一位是不同的。以8*8分辨率为例,以列为例:(a)代表二进制码(b)代表格雷码

格雷码结构光(用于立体视觉)原理详解+结构光编码实现
格雷码结构光(用于立体视觉)原理详解+结构光编码实现

格雷码可以通过下述方法得到:首先通过之前的办法得到二进制码,后根据下图的异或运算得到:

格雷码结构光(用于立体视觉)原理详解+结构光编码实现

格雷码相对于二进制码的优势在于:在最后的pattern中,二进制码的最大频率(或者说是最小颜色变化间隔)是每一个像素,而格雷码的频率是每两个像素,我们希望最大频率时,最小颜色变化间隔尽可能大一些,这对投影和采图都是有好处的。

四、双目匹配

本文以介绍格雷码为主,故不在此详细讲述双目原理。
           

匹配原则:根据双目视差法,找到左右目拍摄到的同一个点,即可获得深度信息。

我们通过投射结构光,对于每一个投影仪像素点,其最终的码值是唯一的。这便使得双目匹配成为可能。

格雷码结构光(用于立体视觉)原理详解+结构光编码实现

五、结构光解码

投影仪编码结构光,使得每个像素具有独特的码值,两相机拍摄,需要解码,确定每个像素的信息,进而完成匹配。

解码是编码的逆序。包括三步:

  1. 根据灰度值得到当前像素点的格雷码;
               
  2. 格雷码转换成二进制码;
               
  3. 二进制码转换成十进制码(即当前像素所在的行数或者列数)。
               

六、结构光编码实验

投影仪分辨率:2014*768

NpatternsCol=ceilf(log1024/log2)=10;

NpatternsRow=ceilf(log768/log2)=10;

水平、垂直各生成十张pattern。

其中pattern0、pattern1是全黑、全白,用作参考

格雷码结构光(用于立体视觉)原理详解+结构光编码实现
格雷码结构光(用于立体视觉)原理详解+结构光编码实现

继续阅读