双目结构光的三维重建方法(相移法+多频外差相位解包)(含相位代码)

   日期:2020-10-05     浏览:432    评论:0    
核心提示:相移法+格雷码的结构光三维重建相移法相移法的原理就是新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增ermaidjs.github.io/)功能快捷键撤销:Ctrl/Command + Z重做:Ctrl/Command + Y加粗:Ctrl/Command + B斜体:Ctrl/Command + I标题:Ctrl/Command + Shift + H无序列表:Ctrl/Command + Shift + U有序列表:C

双目结构光测量系统

顾名思义,双目结构光就是采用两个相机+投影仪的结构,两个相机分别放置在投影仪的两侧。该系统测量原理首先采用投影仪投射设计的光栅编码图案到测量对象表面,然后被双目相机同步采集,两个相机分别对光栅图像做相位解包算法,利用相位信息对双目视觉进行匹配,然后通过双目视觉的重建方式对测量物体重建三维点云。

本博客采用三频外差的方法求解相位信息,然后对双目系统进行去除畸变、立体校正,利用相位对双目进行点对点匹配,然后三维重建点云。

三频外差光栅生成

三组频率分别为76、57、37,76为高频条纹的频率,57为中频条纹的频率,37为低频条纹的频率。其中高频的条纹设置为4步相移,中频和低频的分别设置为3步相移,具体的Matlab生成代码如下:

R = 1140;  C = 912;   % 光栅尺寸1140*912

P1 = 1140/76;        % 频率76的光栅宽度
P2 = 1140/57;        % 频率57的光栅宽度
P3 = 1140/37;        % 频率37的光栅宽度

a = 126;           % 背景光强
b = 126;           % 调制光强

I0 = zeros(1140,912);   %定义图像尺寸大小
H1 = I0; H2 = I0; H3 = I0; H4 = I0;
H5 = I0; H6 = I0; H7 = I0; 
H8 = I0; H9 = I0; H10 = I0;

for i = 1:1140
    for j = 1:912
        H1(i,j) = a+b*cos(2*pi*(j-1)/P1);                %4步相移余弦光栅 --高频
        H2(i,j) = a+b*cos(2*pi*(j-1)/P1+1*2*pi/4);
        H3(i,j) = a+b*cos(2*pi*(j-1)/P1+2*2*pi/4);
        H4(i,j) = a+b*cos(2*pi*(j-1)/P1+3*2*pi/4);
        
        H5(i,j) = a+b*cos(2*pi*(j-1)/P2-2*pi/3);         %3步相移余弦光栅 --中频
        H6(i,j) = a+b*cos(2*pi*(j-1)/P2);
        H7(i,j) = a+b*cos(2*pi*(j-1)/P2+2*pi/3);
        
        H8(i,j) = a+b*cos(2*pi*(j-1)/P3-2*pi/3);         %3步相移余弦光栅 --低频
        H9(i,j) = a+b*cos(2*pi*(j-1)/P3);
        H10(i,j) = a+b*cos(2*pi*(j-1)/P3+2*pi/3);
 
    end
end 

%% ----------------------【光栅写出】--------------------------

for k = 1:10
    eval(['H','=H',num2str(k),';']);
    H = uint8(H);
    img_name = ['gratings/',num2str(k),'.bmp'];
    imwrite(H,Himg_name);
end

三频外差相位解包

每个频率的光栅求出的相位都是包裹相位,其形式如同下式的 ϕ ( x , y ) \phi(x,y) ϕ(x,y)所示,这样的相位图不能直接用于双目匹配,为了获取绝对相位 Φ ( x , y ) \Phi(x,y) Φ(x,y),我们需要获取一个条纹阶次 k ( x , y ) k(x,y) k(x,y),然后通过下式将包裹相位展开为绝对相位:
Φ ( x , y ) = ϕ ( x , y ) + 2 π × k ( x , y ) \Phi(x,y) = \phi(x,y) + 2\pi \times k(x,y) Φ(x,y)=ϕ(x,y)+2π×k(x,y)

三频外差的高频条纹就是为了获取包裹相位,这里有人可能会问,为什么其他频率的不能当作包裹相位 ϕ ( x , y ) \phi(x,y) ϕ(x,y)呢,因为条纹频率越高,信噪比就越大,因此高频的相位精度更好。中频和低频的光栅就是为了获取 k ( x , y ) k(x,y) k(x,y)的,其具体获取方式如下(matlab代码):

% ----------------变量预定义
[R C] = size(H1);
phi1 = zeros(R,C);  phi2 = phi1;  phi3 = phi1;
k1 = phi1;  k2 =phi1;  k = phi1;
phi_eq2 = phi1; phi_eq1 = phi1;  phi_eq = phi1;
phase = phi1;
% ---------------高频包裹相位phi1
phi1 = atan2(H4-H2,H1-H3);
phi1(phi1<0) = phi1(phi1<0)+2*pi;

% ---------------中频包裹相位phi2
phi2 = atan2(sqrt(3)*(H5-H7),2*H6-H5-H7);
phi2(phi2<0) = phi2(phi2<0)+2*pi;

% ---------------低频包裹相位phi3
phi3 = atan2(sqrt(3)*(H8-H10),2*H9-H8-H10);
phi3(phi3<0) = phi3(phi3<0)+2*pi;

% ---------------高频-中频外差相位phi_eq1
phi_eq1 = phi1-phi2;
phi_eq1(phi_eq1<0) = phi_eq1(phi_eq1<0)+2*pi;
% ---------------中频-低频外差相位phi_eq2
phi_eq2 = phi2-phi3;
phi_eq2(phi_eq2<0) = phi_eq2(phi_eq2<0)+2*pi;
% ---------------高频-中频-低频外差相位phi_eq(三个频率的综合外差)
phi_eq =  phi_eq2-phi_eq1;
phi_eq(phi_eq<0) = phi_eq(phi_eq<0)+2*pi;

L_12 = p1*p2/(p2-p1);          % 外差相位phi_eq1波长
L_23 = p2*p3/(p3-p2);          % 外差相位phi_eq2波长
L_eq = L_23*L_12/(L_12-L_23);  % 外差相位phi_eq波长

k1 = round(((L_12/p1)*phi_eq1-phi1)/(2*pi));  
k2 = round(((L_eq/L_12)*phi_eq-phi_eq1)/(2*pi));
k = k2*(L_12./p1) + k1;

% -----------------------相位展开,得绝对相位phase---------------------------
phase = phi1 + k*2*pi;

实验

投影仪投射光栅,被左右相机同时采集,然后通过上次的方式进行相位解包,进行双目相机匹配和三维重建,然后获取了三维点云。


如需交流合作,可以联系qq:1091454117

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服