相移法+格雷码

多频外差:需要拍摄多幅图片,对于动态的三维重建不友好
格雷码:高鲁棒性

二值码

亮区域-编码0,暗区域-编码1
假设投射三幅图案,则编码方式如下:
相移法+格雷码_第1张图片
二值码和格雷码比较
相机拍摄–一个像素点正好在黑白相间的边界点–容易发生解码错误

格雷码生成

1.生成步骤:
(1)生成0,1–>0,1
(2)每一个前面+0–>00,01,翻转首个元素、其余取对称–>11,10
(3)每一个前面+0–>000,001,011,010,翻转首个元素,其余取对称–>110,111,101,100
(4)递归

2.matlab代码:

%code字符串中存放n位格雷码的表示
function [code] = m_gray_code(n) %n是格雷码的位数
    if (n < 1)
        disp("格雷码数量必须大于0");
        return;
    elseif (n == 1)
        % 产生01 两个数字
        code = ["0", "1"];
        % 返回code
    else
        code_pre = m_gray_code(n - 1);
        [~, num] = size(code_pre);
        % 初始化一个数组
        code = repmat("", 1, num * 2);
        % step1:每个字符串前面都+0
        idx = 0;
        for i = 1: num
            idx = idx + 1;
            code(idx) = "0" + code_pre(i);
        end
        % step2:翻转首个元素,其余取对称
        for i = num: -1: 1
            idx = idx + 1;
            code(idx) = "1" + code_pre(i);
        end
    end
end

格雷码解码

生成的格雷码图案如下图(假设n=4)
相移法+格雷码_第2张图片

1.一个像素点在一连串格雷码图案中的最小亮度Imin,最大亮度Imax
2.该像素点目前的亮度I
3.计算:
在这里插入图片描述
In是该像素的亮度归一化后的值,0<=In<=1,则In接 近于0,说明是暗条纹,接近于1,说明是亮条纹
4.为了解决全0和全1的情况,额外投射两幅全0和全1的图像
5.假如n=4,那么是4位格雷码,解码情况是
相移法+格雷码_第3张图片

求解相位

一、3+4+2/静态

1.选用4幅格雷码图的原因:因为相移法投射的正弦条纹是16个周期,所以选用4幅格雷码图案(2^4=16个区域),一个区域对应一个周期

2.需要投射一幅全黑和全白的图案的原因:投射的是黑白分明的格雷码图,拍回来的经过低通滤波,是有点灰色的图案,计算投射全黑和全白的均值-(I黑+I白)/2,作为阈值,然后进行二值化,就把灰度图变成了黑白分明的图
相移法+格雷码_第4张图片

2.具体相位展开过程:

相移法+格雷码_第5张图片
1)通过相移法求解出包裹相位φ
2)通过解格雷码计算出每个像素点的V和k
3)
在这里插入图片描述3.进行三维重建

二、3+4+1/静态
1.需要投射一幅 GC5,是周期更密的一幅格雷码图,原因:消除边缘跳变

2.怎么确定一个阈值(即区分出某个像素点此时是1还是0):
相移法+格雷码_第6张图片
将三幅相移图 每个像素点的三个灰度值I1,I2,I3求均值=投射全黑和全白图后 每个像素点的灰度值I黑,I白求均值,发现效果是一样的,使用可以节约两幅图(投射全白和全黑),如下:
相移法+格雷码_第7张图片
3.解相位过程

相移法+格雷码_第8张图片1.按照原方法(只有4位格雷码)求出V和k1(k1是)
2.加上第5位格雷码,求出k2(可以看出,k2比k1左移了半个周期)
3.计算相位
相移法+格雷码_第9张图片4.实例分析
相移法+格雷码_第10张图片
由图可见:没有边缘跳变

三、3+4动态
1.去除原来的GC1,通过不同时间投射不同的图案,构建出GC1
相移法+格雷码_第11张图片相邻两个时间-做一个异或操作
相移法+格雷码_第12张图片

你可能感兴趣的:(matlab,开发语言,计算机视觉)