Я работаю над разреженной реконструкцией, используя калиброванную стереопару. Это подход, который я сделал шаг за шагом:деформированные/изогнутые облака точки
1- I Калибровка стереоаппаратуры с помощью приложения Stereo Camera Calibrator в MATLAB.
2- I Взял пару стереоизображений и Undistorted каждое изображение.
3- Я обнаруживаю, извлекаю и совмещаю функции.
4- Я использую функцию триангуляции в MATLAB для получения трехмерных координат совпадающих точек, передавая объект stereoParametes в триангуляцию. Полученные 3D-координаты относятся к оптическому центру камеры 1 (правая камера) и находятся в миллиметрах.
Проблема в том, что точечные облака, кажется, искажены и изогнуты к краям изображения. сначала это казалось искажением линз для ствола. поэтому я перекалибровал камеры XB3 шмелей, используя приложение калибратора камеры MATLAB. но на этот раз я использовал 3 коэффициента радиального искажения, а также включил тангенциальные и косые параметры. но результаты те же. Я также опробовал инструментарий калибровки камеры Caltech, но имел те же результаты, что и MATLAB. коэффициенты радиального искажения аналогичны в обоих наборах инструментов. Другая проблема заключается в том, что значения Z в облаке точек все отрицательные, но я думаю, что это может произойти из-за того, что я использую правую камеру в качестве камеры 1 и левую камеру в качестве камеры 2, в отличие от системы координат MATLAB ссылка прилагается.
Я прикрепил пару изображений 3D облака точек из разреженной и плотной 3D-реконструкции. Я не перейду в Dense 3D, но просто хотел сделать это, чтобы увидеть, существует ли проблема, какая она есть. Я считаю, что основная проблема связана с калибровкой изображений и камеры, а не с алгоритмами.
Теперь мои вопросы:
1- Что является основной причиной/причины для искривленных/изогнутых облака 3D точек? это только калибровка камеры или другие шаги могут привести к ошибке? как я могу это проверить?
2- Можете ли вы предложить другую панель для калибровки камеры помимо MATLAB и Caltech? возможно, тот, который больше подходит для радиальных искажений?
Благодаря
Изображения:
Ссылки:
Код:
clear
close all
clc
load('mystereoparams.mat');
I11 = imread('Right.tif');
I22 = imread('Left.tif');
figure, imshowpair(I11, I22, 'montage');
title('Pair of Original Images');
[I1, newOrigin1] = undistortImage(I11,stereoParams.CameraParameters1);
[I2, newOrigin2] = undistortImage(I22,stereoParams.CameraParameters2);
figure, imshowpair(I1, I2, 'montage');
title('Undistorted Images');
% Detect feature points
imagePoints1 = detectSURFFeatures(rgb2gray(I1), 'MetricThreshold', 600);
imagePoints2 = detectSURFFeatures(rgb2gray(I2), 'MetricThreshold', 600);
% Extract feature descriptors
features1 = extractFeatures(rgb2gray(I1), imagePoints1);
features2 = extractFeatures(rgb2gray(I2), imagePoints2);
% Visualize several extracted SURF features
figure;
imshow(I1);
title('1500 Strongest Feature Points from Image1');
hold on;
plot(selectStrongest(imagePoints1, 1500));
indexPairs = matchFeatures(features1, features2, 'MaxRatio', 0.4);
matchedPoints1 = imagePoints1(indexPairs(:, 1));
matchedPoints2 = imagePoints2(indexPairs(:, 2));
% Visualize correspondences
figure;
showMatchedFeatures(I1, I2, matchedPoints1, matchedPoints2,'montage');
title('Original Matched Features from Globe01 and Globe02');
% Transform matched points to the original image's coordinates
matchedPoints1.Location = bsxfun(@plus, matchedPoints1.Location, newOrigin1);
matchedPoints2.Location = bsxfun(@plus, matchedPoints2.Location, newOrigin2);
[Cloud, reprojErrors] = triangulate(matchedPoints1, matchedPoints2, stereoParams);
figure;plot3(Cloud(:,1),Cloud(:,2),Cloud(:,3),'b.');title('Point Cloud before noisy match removal');
xlabel('X'), ylabel('Y'), zlabel('Depth (Z) in mm')
% Eliminate noisy points
meanmean=mean(sqrt(sum(reprojErrors .^ 2, 2)))
standdev=std(sqrt(sum(reprojErrors .^ 2, 2)))
errorDists = max(sqrt(sum(reprojErrors.^2,2)),[],14);
validIdx = errorDists < meanmean+standdev;
tt1=find(Cloud(:,3)>0);
validIdx(tt1)=0;
tt2=find(abs(Cloud(:,3))>1800);
validIdx(tt2)=0;
tt3=find(abs(Cloud(:,3))<1000);
validIdx(tt3)=0;
points3D = Cloud(validIdx, :);
figure;plot3(points3D(:,1),points3D(:,2),points3D(:,3),'b.');title('Point Cloud after noisy match removal');
xlabel('X'), ylabel('Y'), zlabel('Depth (Z) in mm')
validPoints1 = matchedPoints1(validIdx, :);
validPoints2 = matchedPoints2(validIdx, :);
figure;
showMatchedFeatures(I1, I2, validPoints1,validPoints2,'montage');
title('Matched Features After Removing Noisy Matches');
% get the color of each reconstructed point
validPoints1 = round(validPoints1.Location);
numPixels = size(I1, 1) * size(I1, 2);
allColors = reshape(im2double(I1), [numPixels, 3]);
colorIdx = sub2ind([size(I1, 1), size(I1, 2)], validPoints1(:,2), ...
validPoints1(:, 1));
color = allColors(colorIdx, :);
% add green point representing the origin
points3D(end+1,:) = [0,0,0];
color(end+1,:) = [0,1,0];
% show images
figure('units','normalized','outerposition',[0 0 .5 .5])
subplot(1,2,1);
imshowpair(I1, I2, 'montage');
title('Original Images')
% plot point cloud
hAxes = subplot(1,2,2);
showPointCloud(points3D, color, 'Parent', hAxes, ...
'VerticalAxisDir', 'down', 'MarkerSize', 40);
xlabel('x-axis (mm)');
ylabel('y-axis (mm)');
zlabel('z-axis (mm)')
title('Reconstructed Point Cloud');
figure, scatter3(points3D(:,1),points3D(:,2),points3D(:,3),50,color,'fill')
xlabel('x-axis (mm)');ylabel('y-axis (mm)');zlabel('z-axis (mm)')
title('Final colored Reconstructed Point Cloud');