论文总字数:42132字
基于π相移傅里叶变换和双目视觉的
三维重构算法软件说明书
机械工程 院(系) 机械工程 专业
学 号 02015708
学生姓名 方田
指导教师 罗晨
一、软件介绍
图 1.流程图
本文设计的软件基于matlab R2018a平台进行编写的,主要流程图如图1所示。
交叉光轴单目测量实验中,投影仪投射出两幅相移图到物体上,通过两幅变形条纹灰度图的相减,进行傅里叶变换,由于相移技术,零频会被消除,再以矩形窗滤出基频,将其移至零频位置,再进行逆傅里叶变换后求角度,方便后面的立体匹配。使用相位展开算法算法对包裹相位图进行展开,再根据系统标定得到的参数实现绝对相位与高度的映射,得出点云后,进行一定阈值的过滤将参考面上的点过滤清除,再利用matlab的面形绘制函数将代表物体面形的点云绘制成面,实现面形测量与重构。
双目移动物体重构实验软件中,首先利用matlab的Stereo Camera Calibrator工具箱进行双目标定,分别获取左右相机的内参和外参矩阵,根据标定结果计算出两相机间的旋转矩阵和平移向量,并利用rectifyStereoImages()函数完成立体标定。标定结束后左右相机获得的图像便可通过像素平移补偿物体的平移,后面步骤便与单目相同。
二、界面设计
图 2 系统界面
如图2所示,利用matlab的GUI(Graphical User Interface,称图形用户接口)设计了实验的软件系统界面。界面操作流程为:
- 通过点击“选择图片”按钮连续选择两张电脑文件夹里的bmp或jpg格式的相移前后的变形条纹图(单目移静止物体的三维测量直接输入裁剪后的两张变形条纹图,双目移动物体的三维测量需进行立体校正后再裁剪以输入)。
- 点击“开始重构”按钮,利用本实验编写的程序进行图形处理后,绘制出可旋转查看的重构模型以及计算显示最大高度()。
三、程序说明
程序功能主要为:对得到的两幅图进行灰度值相减后进行离散傅里叶变换,然后移频得到以图像中心为原点的频谱图,使用矩形窗将基频提取出来后已知零频位置,再进行逆傅里叶变换后,对得到的二维复数矩阵进行求角度运算,得到包裹相位图,利用相位展开算法进行相位展开带入相位-高度映射关系式,得出重构的点云,利用matlab的绘图功能添加材质、颜色、光照后显示重构面性。按照步骤,得出基频的程序为“Pretreatment.m”,根据实验图片所在文件夹位置进行更改部分代码内容。三种算法包括最小二乘法(“LeastSquares.m”)、枝切法(“GoldsteinUnwrap2D.m”,其中包括了功能函数:残差点计算函数“PhaseResidues()”、枝切线建立函数“BranchCuts()”、相位展开函数“FloodFill()”)以及质量图引导法(“QualityGuidedUnwrap2D.m”,包括了功能函数:质量图生成函数“PhaseDerivativeVariance()”、相位展开函数“GuidedFloodFill()”),重构程序为“Reconstruction.m”。
双目移动物体的三维测量实验中另有标定步骤在前,进行立体校正后再进行处理。其中立体标定及裁剪程序为“StereoCorrection.m”,标定工具也可使用“标定工具箱”里封装好的程序。
上述两种实验也均可在界面中进行直接处理进行重构,单目移静止物体的三维测量中需要先对两张变形条纹图进行裁剪放大,双目移动物体的三维测量中需进行立体校正后再裁剪。界面图设计见“Mygui.figure”,程序见“Mygui.m”。
四、附录
1.Pretreatment.m
I1=imread('C:\Users\Administrator\Desktop\experiment\实验11\3.bmp');
% I2=rgb2gray(I1);
Ia=im2double(I1);
Ia=Ia(310:719,336:755);
imwrite(Ia,'3.bmp')
figure;
imshow(Ia);title('π相移前条纹图');
I_fftA=fftshift(fft2(Ia));
aA=abs(I_fftA);
figure;mesh(abs(I_fftA));title('π相移前条纹图立体频谱图');
I3=imread('C:\Users\Administrator\Desktop\experiment\实验11\4.bmp');
% I3=rgb2gray(I3);
Ib=im2double(I3);
Ib=Ib(310:719,336:755);
imwrite(Ib,'4.bmp')
figure;imshow(Ib);title('π相移后条纹图');
I_fftB=fftshift(fft2(Ib));
aB=abs(I_fftB);
figure;mesh(abs(I_fftB));title('π相移厚条纹图立体频谱图');
%
I=Ia-Ib;
figure;
imshow(I);title('相减后条纹图');
I_fft=fftshift(fft2(I));
a=abs(I_fft);
figure;imshow(log(1 abs(I_fft)),[]);title('相减后条纹图频谱图');
figure;mesh(abs(I_fft));title('相减后条纹图立体频谱图');
w1=30;
w2=50;
Window=ones(w1 w1 1,2*w2 1);
figure;mesh(Window);title('滤波器');
jipin=zeros(410,420);
jipin(206-w1:206 w1,211-w2:211 w2)=I_fft(242-w1:242 w1,211-w2:211 w2).*Window; %取基频
figure;imshow(log(1 abs(jipin)),[]);title('基频转移至中心');
figure;mesh(abs(jipin));title('基频转移至中心');
jipin_ifft=(ifft2(ifftshift(jipin)));
save jipin_ifft;
2.LeastSquares.m
function out =erchangfa(wp)
%最小二乘法解相位
phi=wp;
[m,n] = size(phi);
phidx=zeros(m,n);
phidy=zeros(m,n);
phidx(1:m-1,:)= angle(exp(1i*(phi(2:m,:)-phi(1:m-1,:))));
phidy(:,1:n-1)= angle(exp(1i*(phi(:,2:n)-phi(:,1:n-1))));
%对包裹相位求二阶偏微分
Rou3 = zeros(m,n);
Rou3dx = zeros(m,n);
Rou3dy = zeros(m,n);
Rou3dx(1:m-1,:) = phidx(2:m,:)-phidx(1:m-1,:);
Rou3dy(:,1:n-1) = phidy(:,2:n)-phidy(:,1:n-1);
Rou3 = Rou3dx Rou3dy;
figure;
surf(Rou3,'FaceColor','interp', 'EdgeColor','none','FaceLighting','phong');
camlight left, axis tight
xlabel('X/Pixels','FontSize',14);ylabel('Y/Pixels','FontSize',14);zlabel('Phase/Radians','FontSize',14);%title('lou3','FontSize',14)
set(figure(3),'name','R(x,y) 3D','Numbertitle','off');
figure;
imshow(Rou3,[]);
xlabel('X/Pixels','FontSize',14);ylabel('Y/Pixels','FontSize',14);
set(figure(4),'name','R(x,y) 2D','Numbertitle','off');
% DCT求解泊松方程
tic
PP3 = dct2(Rou3);
for ii=1:m
for jj=1:n
k1=2*cos((ii-1)*pi/(m));
k2=2*cos((jj-1)*pi/(n));
KK = k1 k2-4;
PH3(ii,jj) = PP3(ii,jj)/KK;
end
end
PH3(1,1) = -(PH3(1,2) PH3(2,1) - PP3(1,1))/2;
phi3 = idct2(PH3);
toc
phi3 = phi3(1:m,1:n); %解包裹出的相位
figure;
mesh(phi3);title('展开相图');
out=phi3;
end
3.GoldsteinUnwrap2D.m
%% REPLACE WITH IMAGES
load jipin_ifft;
IM_mask=ones(size(jipin_ifft)); %Mask (if applicable)掩膜
%%
IM_mag=abs(jipin_ifft); %Magnitude image幅度图像
IM_phase=angle(jipin_ifft); %Phase image相位图
%% Set parameters
max_box_radius=4; %最大搜索框半径(像素)
threshold_std=5; %用于阈值幅度图像的噪声标准偏差的数量
%% Unwrap
residue_charge=PhaseResidues(IM_phase, IM_mask); %计算相残留物
branch_cuts=BranchCuts(residue_charge, max_box_radius, IM_mask); %放置分支切口
[IM_unwrapped, rowref, colref]=FloodFill(IM_phase, branch_cuts, IM_mask); %Flood fill phase unwrapping
%% Display results
figure; imagesc(residue_charge), colormap(gray), axis square, axis off, title('Phase residues (charged)');
剩余内容已隐藏,请支付后下载全文,论文总字数:42132字
该课题毕业论文、开题报告、外文翻译、程序设计、图纸设计等资料可联系客服协助查找;