本文装置基于一维运动平台-传送带,可以实现单视角线激光扫描三维重建,也可实现多视角多线激光扫描三维重建。内容包括:标定工作(相机标定、光平面标定、扫描方向标定、多相机全局标定)、激光中心线提取工作、图像和点云处理工作等等。 主函数代码如下, 涉及各部分的代码在均在工程中自定义实现:
clc
clear
close all
%数据载入区———————————————
A255440 = load('A255440.mat');
R255440 = load('R255440.mat');
T255440 = load('T255440.mat');
laserPlane255440 = load('laserPlane255440.mat');
x255440 = load('x.mat');
y255440 = load('y.mat');
z255440 = load('z.mat');
%
A = A255440.A;
R = R255440.R;
T = T255440.T;
a = laserPlane255440.a;
b = laserPlane255440.b;
c = laserPlane255440.c;
d = laserPlane255440.d;
x =x255440.x;
y =y255440.y;
z =z255440.z;
%生成点云数据———————————————
Files = dir(fullfile('../img2/','*.bmp'));
picture_num = length(Files);
% WCS = [];%所有点世界坐标
WCS = zeros(100000,3);
Points = zeros(100000,3);
points_num = 0;
for frame_index = 1 : 291
fprintf('Processing %d th image...\n',frame_index);
pictures = {Files.name};
framename = pictures{frame_index};
frame = imread(framename);
laserPixel = findLaserCenter(frame,1,1451,400,1200,0);
%调用findLaserCenter函数提取中心线
for pixel_index = 1 : length(laserPixel)
[Xw, Yw, Zw] = pcs2wcs(laserPixel(pixel_index, 1), laserPixel(pixel_index,2), A,R(:,:,7), T(:,:,7), a, b, c, d);
%调用pcs2wcs函数,将像素坐标转化为世界坐标系坐标
Xw = Xw + x * (picture_num - frame_index);%物体运动方向是向上的,所以Yw是有变化的。
Yw = Yw + y * (picture_num - frame_index);
Zw = Zw + z * (picture_num - frame_index);
%最后一根扫描线是Yw,第一根扫描线在最终的三维模型中是最上面的一根激光线,所以要在Yw的基础上加上其余扫描线间的间隔。
WCS(pixel_index,:) = [Xw,Yw,Zw];
%得到三维点云数据
end
Points(points_num + 1 : points_num + length(laserPixel),:) = WCS(1 : length(laserPixel),:);
points_num = points_num + length(laserPixel);
end
save('..\3D_point255440.txt', 'Points', '-ascii');%保存在lightpoint_a1.txt文本文档中
fprintf(' Processing Complete! Saved as ‘3D_point255440.txt‘ \n');%命令行窗口打印这段文字
加qq:936874728与作者交流 结果如下: 部分视角拼接工作:
|