激光三角法实验报告
学院:
指导教师:
学生:
学号:
激光三角法实验报告
随着工业测量领域的不断扩展以及对测量精度和测量速度的不断提高,传统的接触是测量已经无法满足工业界的需求。而非接触测量由于其良好的精确性和实时性,已经成为测量领域的热点。同时由于电子学和光学技术的飞速发展,光电检测已经成为非接触测量的一种主要方法。激光三角法(Laser Triangulation)是光电检测技术的一种,由于该方法具有结构简单、测试速度快、不易损伤表面、测量距离大、抗干扰、测量准确度高、实时处理能力强、使用灵活方便等优点,在工业中的长度、距离以及三维形貌等检测中有着广泛的应用。
一、实验原理
1、激光三角法测距
图表1激光三角法测距原理图
如图1所示,激光三角法的测量仪器主要由激光发射器、透镜和CCD组成。在测量过程当中使用激光光源作为测量的指示光源,激光器的轴线、成像物镜的光轴以及CCD 线阵,三者位于同一个平面内。激光光源照射到物体上某一点,该目标点的图像通过透镜汇聚到CCD上形成像点。当激光照射的物体沿激光光轴移动时,像点也在CCD像面上
移动。在CCD焦距已知,光源、透镜和CCD的相对位置确定的前提下,通过测量CCD上像点的位置就能准确确定被测物体移动的距离。
图1中,已知透镜的轴线与激光束的夹角为α,CCD像平面与镜头光轴的夹角为β,像面距镜头的距离s’约等于镜头焦距f,物距为s,像点在CCD上移动距离d,物点在激光束方向上的移动距离为δ,则:
δ=
ds
s′sinα+d sin(α+β)
通常情况下,β等于90°,即CCD像平面与镜头主光轴垂直,所以:
δ=
ds
2、激光三角法三维重建
在图1中,将激光束沿直面垂直方向延伸成激光面。激光将一个理想的光斑投射在被测表面上,沿激光束方向移动被测物体,该光斑将随其投射点位置的深高度坐标变化而沿着激光器的轴向作同样距离的位移。光斑同时又通过物镜成像在CCD线阵上,且成像位置与光斑的深度,位置有唯一的对应关系。测出CCD线阵上所成实像的中心位置,即可通过光斑与其在CCD线阵上所成像点的位置几何光学关系求出光斑的高度坐标,从而得到被测表面该点处的深度参数。通过对若干采样线条的测量,就能得到被测表面形貌的一组数据。
二、实验仪器
1、摄像头
2、激光器
3、被测物体
3、直尺、三角板等
三、实验内容
1、棋盘法,摄像机镜头标定
Calibration results after optimization (with uncertainties):
Focal Length: fc = [ 756.43812 759.72668 ] ?[ 15.49074 17.22837 ]
Principal point: cc = [ 271.37288 225.46669 ] ?[ 43.81021 30.02520 ]
Skew: alpha_c = [ 0.00000 ] ?[ 0.00000 ] => angle of pixel axes =
90.00000 ?0.00000 degrees
Distortion: kc = [ -0.20907 0.66411 -0.00512 -0.00912
0.00000 ] ?[ 0.15997 0.97373 0.01015 0.01355 0.00000 ]
Pixel error: err = [ 1.86400 1.64923 ]
Note: The numerical errors are approximately three times the standard deviations (for reference).
即摄像机镜头焦距f=756mm。
2、激光三角法测距
图表2激光三角测距实验平台
如图2,摆放试验装置,其中物距s=270mm,透镜的轴线与激光束的夹角为α取45度。物体沿激光光轴方向移动,步长为2mm,共标定9个点。
图表3测距第一个点
图表4测距第二个点
图表5激光三角测距9幅图片
Matlab程序见附件1。
Matlab计算出的各点中心坐标
图表6各中心点坐标
被测物体位移的测量值
图表7位移测量值
拟合直线
以标准步长2mm为横坐标,物距测量值为纵坐标,拟合直线。
图表8测量值与实际值拟合直线
拟合结果
Linear model Poly1:
f(x) = p1*x + p2
Coefficients (with 95% confidence bounds):
p1 = 0.9737 (0.8985, 1.049)
p2 = 0.2286 (-0.4873, 0.9445)
Goodness of fit:
SSE: 1.698
R-square: 0.9926
Adjusted R-square: 0.9915
RMSE: 0.4926
3、激光三角法三维重建
图表9三维重建实验平台
如图9,摆放实验器材,其中物距s=270mm,透镜的轴线与激光束的夹角为α取45度。以鼠标作为被测物体,物体沿激光光轴方向移动,步长为2mm,共拍摄15张图片。
图表10三维重建第一张图
图表11三维重建第二张图
图表12三维重建15张图片
图表13二值去噪提取中心线后的第一张图片Matlab程序见附件2。
三维重建结果
图表14三维重建结果
图表15 X-Y平面图
图表16 Y-Z方向平面图
图表17 Y-Z方向平面图四、实验小结:
此实验比较复杂但内容丰富,经过一段时间的努力及老师的指导和同学的交流,最终顺利完成了基本任务。
实验过程中第一步摄取照片很关键,照片的效果好坏直接决定了后续程序处理(主要是滤波)这块的复杂程度,原始照片杂波太复杂,则程序上会比较困难,而且,最后的结果误差也会表达。本次实验,我吸取了其他同学的经验,在晚上拍摄照片,照片效果较好。但是在激光三角测量的拍摄过程中,由于拍摄最后几张图片时,摄像机有些微的移动,导致照片不能被使用,最终只选择了9幅图片进行处理,误差偏大。
其次,程序的编写也很关键。程序横向主要分两块,标定和建模;纵向分为图片的处理、计算标定结果和三维重建。在编程过程中,遇到最大的一个困难就是二值化过程中噪声的去除,在确定了主体思路后,参数的调整(如腐蚀模板大小,阈值的大小等)花去了很多调试的时间。图像的中心线提取则是在研读了以前学长的程序的基础上进行设计,所以少走了很多弯路。总的来说,在这次程序的编写过程中,学到了很多,如果加深了图像处理上的腐蚀、去噪、二值化等等的概念的理解,对matlab基本操作和程序调试更加熟悉。
附件1:
激光三角测距Matlab程序
clear all;
rows= 1:566;
cols= 1:805;
jj=756;%定义焦距为756mm
wj=270;%物距为270mm
a=45/180*3.14159;%镜头的轴线与激光束的夹角为45度
for m=1:9
typ='.jpg';
fname=num2str(m);
image=strcat(fname,typ);
pic=imread(image);
% figure:imshow(pic(:,:,1));
%%%%%%%%%图片二值化处理%%%%%%%
pic_red=(pic(:,:,1)>230);
pic_red(1:50,1:805)=0;
pic_red(500:566,1:805)=0;
pic_red(1:566,1:85)=0;
pic_red(1:566,710:805)=0;
%%%%%%%%%计算每个标定点的中心点坐标%%%%%%%%%%%%%%
areapic_red= sum(sum(double(pic_red)));
colpic_red= sum(sum(double(pic_red)).* cols)/ areapic_red;
rowpic_red= sum(sum(double(pic_red')).* rows)/ areapic_red;
point(m,1)=colpic_red;
point(m,2)=rowpic_red;
end
for m=1:9
pix(m)=(point(m,1)-point(1,1))*(point(m,1)-point(1,1))+(point(m,2)-po int(1,2))*(point(m,2)-point(1,2));
pix(m)=(pix(m))^(0.5);
d(m)=pix(m);
end
for m=1:9
wu(m)=(d(m)*wj)/(jj*sin(a)+d(m)*cos(a)); %计算物距
end
附件2:
x0=0;
jj=756; %定义焦距为756mm
a=45/180*3.14159;%镜头的轴线与激光束的夹角为45度
%%%%%%%%%%%依次读入15幅图像并处理%%%%%%%%%
for m=16:30
x1=x0+(m-16)*2;%x1步进2mm
typ='.jpg';
fname=num2str(m);
image=strcat(fname,typ);
pic=imread(image);
red=pic(:,:,1)>10;
red_1=uint8(red);
pic_red(:,:,1)=red_1.*pic(:,:,1);
pic_red(:,:,2)=red_1.*pic(:,:,2);
pic_red(:,:,3)=red_1.*pic(:,:,3);
pic_1=im2bw(pic_red,0.05);%二值化
%%%将多余点直接覆为零
pic_1(260:506,100:600)=0;
pic_1(1:50,1:805)=0;
pic_1(500:566,1:805)=0;
pic_1(1:566,1:85)=0;
pic_1(1:566,710:805)=0;
%%%%%%找出处理后每张图片的中心线%%%%%%%%
for i=1:566
n=find(pic_1(i,:));
if isempty(n) f(i)=0;
else f(i)=round(n(1)+0.5*length(m));
end
end
g=zeros(size(pic_1));g=im2bw(g);
for j=1:566
if any(pic_1(j,:)) g(j,f(j))=1;
end
end
%%%%%%%%%三维重建%%%%%%%%%%%
[i0,j0,v0]=find(g);
daxiao=size(i0);
for q=1:daxiao
y=double(i0(q)-0);
z=double(j0(q)-0); %取原点坐标为(0,0)
y1=y*300/(jj*sin(a)-y*sin(a));
z1=z*300/(jj*sin(a)-z*sin(a));
plot3(x1,z1,y1),hold on;
end
end