基于正弦结构光的三维重建(MATLAB)
基于正弦结构光的三维重建(MATLAB)
I01
I02
I03
I04
I05
I1
I2
I3
I4
I5
代码:
生成参考面条纹和变形条纹的程序如下
clc
clear all
close all
load dphase1;
h=dphase1;
% 设定光栅大小
M=553;
N=423;
s1=1:M;
s2=1:N;
[x,y]=meshgrid(s2,s1);
% 设定光栅周期
p=15;
f=1/p;
% 系统结构参数
l=150;
d=250;
%%%%%%%%%%%%%%%%%%%%生成参考面条纹%%%%%%%%%%%%%%%%%%%
a0=0.5;%%%%%%%%%%%%%%%%%投影系数
b0=0.5;%%%%%%%%%%%%%%%%%投影系数
phh=2pi/5;%%%%%%%%设定条纹相移量
I01=a0+b0cos(2pifx);%%%%%参考面采集到的第一帧条纹
imwrite(I01,‘I01.bmp’);
I02=a0+b0cos(2pifx+phh);
imwrite(I02,‘I02.bmp’);
I03=a0+b0cos(2pifx+2phh);
imwrite(I03,‘I03.bmp’);
I04=a0+b0cos(2pifx+3phh);
imwrite(I04,‘I04.bmp’);
I05=a0+b0cos(2pifx+4phh);
imwrite(I05,‘I05.bmp’);
figure;
surfl(h);
shading interp;
colormap winter;
xlabel(‘X/pixel’),ylabel(‘Y/pixel’),zlabel(‘Z/mm’);
%axis([0 420 512 0 30]);
view(-37.5,40);
%%%%%%%%%%%生成变形条纹%%%%%%%%%%%
ph=(2pih/p)/(l/d);%%%%%%%%%物体高度引起的相位变化%%%%%%%%%%%%%
I1=a0+b0cos(2pifx+ph);%%%%%%%%%%受物体高度调制的变形条纹
imwrite(I1,‘I1.bmp’);
I2=a0+b0cos(2pifx+phh+ph);
imwrite(I2,‘I2.bmp’);
I3=a0+b0cos(2pifx+2phh+ph);
imwrite(I3,‘I3.bmp’);
I4=a0+b0cos(2pifx+3phh+ph);
imwrite(I4,‘I4.bmp’);
I5=a0+b0cos(2pifx+4*phh+ph);
imwrite(I5,‘I5.bmp’);
save dphase1;
实现人脸重建的程序如下:
clc;
load Parameters
load dphase1.mat
mask=ones(553,423);
I01=imread(‘I01.bmp’);
I02=imread(‘I02.bmp’);
I03=imread(‘I03.bmp’);
I04=imread(‘I04.bmp’);
I05=imread(‘I05.bmp’);
I01=double(I01);
I02=double(I02);
I03=double(I03);
I04=double(I04);
I05=double(I05);
a=I01.sin(2pi/5)+I02.sin(4pi/5)+I03.sin(6pi/5)+I04.sin(8pi/5)+I05.sin(10pi/5);
b=I01.cos(2pi/5)+I02.cos(4pi/5)+I03.cos(6pi/5)+I04.cos(8pi/5)+I05.cos(10pi/5);
phase0=atan2(a,b);
I1=imread(‘I1.bmp’);
I2=imread(‘I2.bmp’);
I3=imread(‘I3.bmp’);
I4=imread(‘I4.bmp’);
I5=imread(‘I5.bmp’);
I1=double(I1);
I2=double(I2);
I3=double(I3);
I4=double(I4);
I5=double(I5);
a=I1.sin(2pi/5)+I2.sin(4pi/5)+I3.sin(6pi/5)+I4.sin(8pi/5)+I5.sin(10pi/5);
b=I1.cos(2pi/5)+I2.cos(4pi/5)+I3.cos(6pi/5)+I4.cos(8pi/5)+I5.cos(10pi/5);
phase=atan2(a,b);
%计算出相位差
dphase=phase-phase0;
%用LingXingUnwrap2函数做相位展开
unph=LingXingUnwrap2(dphase,mask,1,1);
%重构出物体三维轮廓
figure;
mesh(-unph);
colormap pink;
title(‘重构出的三维人脸图’);
%相位转化为高度
h2=(l/d)(-unph)/(2pi*f);
figure;mesh(h2);
colormap summer;
title(‘相位转换高度后三维人脸图’);
%误差分布图 重建物体-被测物体
load dphase1.mat
error=h2-dphase1;
figure;mesh(error);
colormap prism;
title(‘误差分布图’);
结果:
需要两个表格:名字为:Parameters
以及表格名字为: dphase1
这两个表格是数据,此处无法加,我放在下载那里。