2014-11-13 1 views
3

Я работаю над разреженной реконструкцией, используя калиброванную стереопару. Это подход, который я сделал шаг за шагом:деформированные/изогнутые облака точки

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? возможно, тот, который больше подходит для радиальных искажений?

Благодаря

Изображения:

enter image description here

enter image description here

Ссылки:

coordinate system

Код:

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'); 

ответ

1

Ваш код выглядит правильно. Кажется, что проблема заключается в калибровке. Тот факт, что вы получаете искаженное изображение с тремя коэффициентами, говорит мне, что у вас может не быть достаточного количества точек данных, расположенных близко к краям изображения, чтобы точно оценить искажения. Однако с вашими изображениями это сложно увидеть. Если вы сфотографируете сцену со многими прямыми краями и нерешаете ее, вы получите лучшую идею.

Поэтому я бы рекомендовал брать больше изображений с шахматной доской, как можно ближе к краям изображения. Посмотрите, поможет ли это.

Еще одна вещь, на которую нужно обратить внимание, - это ошибки оценки. В R2014b приложение Calibrator Stereo Camera может опционально возвращать стандартные значения ошибок для каждого из оценочных параметров. Это может дать вам доверительные интервалы и рассказать вам, нужны ли вам больше данных. См. Этот пример.

О, а также убедитесь, что ваши калибровочные изображения не сохранены как jpeg. Используйте формат без потерь, например tiff или png.