Matlab实现三维重建的核心流程是:相机标定(获取相机参数)→ 图像特征匹配 → 三维点云生成(稀疏→稠密)→ 网格重建与可视化,以下是分步拆解的实操教程,包含可直接运行的代码和关键细节:
一、前期准备
- 硬件/图像要求 :
- 拍摄10-20张同一物体/场景的多角度图像(重叠率≥60%),避免强光/逆光,保证纹理丰富;
- 准备棋盘格标定板(如9×6内角点,格子边长20mm),拍摄15-20张不同角度的标定板图像(用于相机标定)。
- 工具箱检查 :确保Matlab安装
Computer Vision Toolbox、Image Processing Toolbox、3D Computer Vision Toolbox,可通过ver命令验证。
二、步骤1:相机标定(核心前提)
相机标定用于消除镜头畸变,获取相机内参(焦距、主点)和外参(位姿),是三维重建的基础。
matlab
% 1. 读取标定板图像(将路径替换为你的标定板图像文件夹)
calib_img_path = 'calibration_board_images/'; % 存放标定板照片的文件夹
calib_imgs = imageDatastore(calib_img_path);
% 2. 设置标定板参数(根据实际标定板修改)
boardSize = [9,6]; % 棋盘格内角点数量(行×列)
squareSize = 20; % 棋盘格单个格子边长,单位mm
% 3. 执行相机标定
[cam_params, used_imgs, reproj_errors] = estimateCameraParameters(...
calib_imgs, ...
'CheckerboardSize', boardSize, ...
'SquareSize', squareSize, ...
'EstimateSkew', false, ... % 一般无需估计倾斜参数
'EstimateTangentialDistortion', true); % 估计切向畸变
% 4. 验证标定效果(重投影误差<0.5像素为合格)
figure; showReprojectionErrors(cam_params);
title('相机标定重投影误差');
关键说明:若重投影误差过大(>1像素),需重新拍摄标定板图像(增加角度、保证棋盘格完整)。
三、步骤2:特征提取与多视图匹配
对重建图像提取SIFT特征并完成跨图像匹配,为后续三维点云生成提供对应关系。
matlab
% 1. 读取待重建的多角度图像(替换为你的图像路径)
recon_img_files = {'img1.jpg','img2.jpg','img3.jpg','img4.jpg','img5.jpg'};
recon_imgs = cellfun(@imread, recon_img_files, 'UniformOutput', false);
% 2. 提取所有图像的SIFT特征点和描述子
num_imgs = length(recon_imgs);
points = cell(1, num_imgs); % 存储特征点
features = cell(1, num_imgs); % 存储特征描述子
for i = 1:num_imgs
gray_img = rgb2gray(recon_imgs{i});
% 检测SIFT特征点
pts = detectSIFTFeatures(gray_img);
% 提取特征描述子(筛选有效特征点)
[feat, valid_pts] = extractFeatures(gray_img, pts);
points{i} = valid_pts;
features{i} = feat;
end
% 3. 多视图特征匹配(匹配相邻图像的特征)
matches = cell(num_imgs-1, 1);
for i = 1:num_imgs-1
% 最近邻匹配,MaxRatio=0.7减少误匹配
idx_pairs = matchFeatures(features{i}, features{i+1}, 'MaxRatio', 0.7);
matches{i} = idx_pairs;
end
四、步骤3:三维点云生成(稀疏→稠密)
1. 稀疏点云(快速预览,仅含特征点)
matlab
% 基于标定参数和匹配特征,三角化生成稀疏点云
[sparse_point3D, ~, ~] = triangulateMultiview(points, features, cam_params);
% 可视化稀疏点云
figure; pcshow(sparse_point3D);
xlabel('X (mm)'); ylabel('Y (mm)'); zlabel('Z (mm)');
title('稀疏三维点云');
grid on; axis equal;
2. 稠密点云(高精度,覆盖完整场景)
稀疏点云仅包含特征点,稠密点云需通过深度估计补全所有像素的三维信息:
matlab
% 1. 以第一张图像为参考,生成深度图
ref_gray = rgb2gray(recon_imgs{1});
depth_map = depthEstimation(ref_gray, recon_imgs{2:end}, cam_params);
% 2. 从深度图生成稠密点云
dense_cloud = reconstructScene(depth_map, cam_params.CameraParameters{1});
% 3. 点云滤波(去除离群点,提升质量)
dense_cloud_filtered = pcdenoise(dense_cloud, 'NumNeighbors', 20);
% 4. 可视化稠密点云
figure; pcshow(dense_cloud_filtered);
title('滤波后稠密三维点云');
xlabel('X (mm)'); ylabel('Y (mm)'); zlabel('Z (mm)');
grid on; axis equal;
五、步骤4:网格重建与三维模型可视化
稠密点云可进一步重建为三角网格模型,便于3D打印、渲染等应用:
matlab
% 1. 点云下采样(减少计算量,网格尺寸2mm)
downsampled_cloud = pcdownsample(dense_cloud_filtered, 'gridAverage', 2);
% 2. 重建三角网格(邻域搜索半径5mm,可根据场景调整)
[faces, vertices] = pc2mesh(downsampled_cloud, 5);
% 3. 可视化网格模型
figure;
trisurf(faces, vertices(:,1), vertices(:,2), vertices(:,3), ...
'FaceColor', 'cyan', 'EdgeColor', 'none');
axis equal; view(3);
xlabel('X (mm)'); ylabel('Y (mm)'); zlabel('Z (mm)');
title('最终三维网格模型');
grid on;