赞
踩
首先需要用到双目视觉平行系统原理
之后了解到三维重建原理
由两张图象的二维图像哥哥像素点的坐标,推导出咱们三维试图重德三维坐标系统中对应的xyz的坐标数值,并显示在Matlab三维图中。
那么像素点怎么找的呢,具体能找到多少个像素点呢,,鉴于现在自己本科那些薄弱的学识,用到的方法就是基元匹配,
使用MATLAB软件进行程序的编写与仿真,对左右摄像头采集到的图像进行特征点的匹配,构建图像的三维模型
首先拍摄了一组人物图像,下面是原始图像
得到校正后的图像和上边的差不多,就不展示了
对校正后的图像进行特征点的匹配,发现噪声过大,标注了150个明显特征点
去除掉多余背景特征点之后,得到较为清晰的三维图像
可以看出,这个人物所占的三维空间是很清楚的被展示出来的。
%% % 双目立体视觉 % 对比实验 %% % 清空工作区 clc; clear; close all; %% % 导入图像数据 I1 = imread('viewleft.png'); I2 = imread('viewright.png'); figure imshowpair(I1, I2, 'montage'); title('Original Images'); % 导入相机参数 load cameraParams.mat %% % 校正 I1 = undistortImage(I1, cameraParams); I2 = undistortImage(I2, cameraParams); figure imshowpair(I1, I2, 'montage'); title('Undistorted Images'); %% % 特征点提取 imagePoints1 = detectMinEigenFeatures(rgb2gray(I1), 'MinQuality', 0.1); %% % 可视化 figure imshow(I1, 'InitialMagnification', 50); title('150 Strongest Corners from the First Image'); hold on plot(selectStrongest(imagePoints1, 150)); %% % Create the point tracker tracker = vision.PointTracker('MaxBidirectionalError', 1, 'NumPyramidLevels', 5); imagePoints1 = imagePoints1.Location; initialize(tracker, imagePoints1, I1); % Track the points [imagePoints2, validIdx] = step(tracker, I2); matchedPoints1 = imagePoints1(validIdx, :); matchedPoints2 = imagePoints2(validIdx, :); %% % 特征点匹配 figure showMatchedFeatures(I1, I2, matchedPoints1, matchedPoints2); title('Tracked Features'); %% % F矩阵估计 [fMatrix, epipolarInliers] = estimateFundamentalMatrix(... matchedPoints1, matchedPoints2, 'Method', 'MSAC', 'NumTrials', 10000); % 极线 inlierPoints1 = matchedPoints1(epipolarInliers, :); inlierPoints2 = matchedPoints2(epipolarInliers, :); % 显示内点 figure showMatchedFeatures(I1, I2, inlierPoints1, inlierPoints2); title('Epipolar Inliers'); %% % R和T(也可以用RANSAC算法) R = [0.9455,-0.0096,0.3253; 0.0120,0.9999,-0.0053; -0.3252,0.0090,0.9456]; t = [98.4069,0.1741,18.9018]; %% % 稠密的特征点 imagePoints1 = detectMinEigenFeatures(rgb2gray(I1), 'MinQuality', 0.001); %% % Create the point tracker 创建一个跟踪点 tracker = vision.PointTracker('MaxBidirectionalError', 1, 'NumPyramidLevels', 5); % Initialize the point tracker imagePoints1 = imagePoints1.Location; initialize(tracker, imagePoints1, I1); % Track the points [imagePoints2, validIdx] = step(tracker, I2); matchedPoints1 = imagePoints1(validIdx, :); matchedPoints2 = imagePoints2(validIdx, :); %% % cameraMatrix camMatrix1 = cameraMatrix(cameraParams, eye(3), [0 0 0]); camMatrix2 = cameraMatrix(cameraParams, R', -t*R'); % 三维点云的计算 points3D = triangulate(matchedPoints1, matchedPoints2, camMatrix1, camMatrix2); % 获取颜色信息 numPixels = size(I1, 1) * size(I1, 2); allColors = reshape(I1, [numPixels, 3]); colorIdx = sub2ind([size(I1, 1), size(I1, 2)], round(matchedPoints1(:,2)), ... round(matchedPoints1(:, 1))); color = allColors(colorIdx, :); % 创建点云 ptCloud = pointCloud(points3D, 'Color', color); %% % 可视化 cameraSize = 0.3; figure plotCamera('Size', cameraSize, 'Color', 'r', 'Label', '1', 'Opacity', 0); hold on grid on plotCamera('Location', t, 'Orientation', R, 'Size', cameraSize, ... 'Color', 'b', 'Label', '2', 'Opacity', 0); % 点云的可视化 pcshow(ptCloud, 'VerticalAxis', 'y', 'VerticalAxisDir', 'down', ... 'MarkerSize', 45); % Rotate and zoom the plot camorbit(0, -30); camzoom(1.5); % Label the axes xlabel('x-axis'); ylabel('y-axis'); zlabel('z-axis') title('Up to Scale Reconstruction of the Scene');
哈哈,顺便说一句,需要在文件中建立加上两张左右相机拍摄出的两张视差照片,并且矫正好,输入你们的相机的R T的参数,这样一个标准的三维重建图片就做好了
我这次实验用的是
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。