Ошибка реконструкции сцены калибровки стереофонической камеры Matlab
Я пытаюсь использовать Системный инструментарий Computer Vision для калибровки пары камер, указанных ниже, чтобы иметь возможность генерировать трехмерное облако точек транспортного средства на расстоянии от 1 до 5 м. Размер выходного изображения составлял приблизительно 1 МБ на изображение для калибровочных изображений шахматной доски, а размер квадрата шахматной доски составлял 25 мм. Используемые камеры представляли собой пару камер SJ4000 HD1080P. Камеры были расположены как можно более параллельно друг другу, без угла на вертикальной оси. Калибровка шахматной доски была выполнена с помощью яркого света и белой доски. Средняя ошибка на пиксель при использовании кода калибратора стереокамеры составляла 3,31 при 31/32 успешных пар. Приблизительное расстояние до шахматной доски составляло 30 см, а расстояние между камерами составляло 20 см. Проблема, с которой я сталкиваюсь при ректификации, - это 3D-реконструкция сцены. На рисунке ниже показано, что было выведено. Я не уверен, есть ли параметр, который отсутствует в настройке камеры, или есть что-то, что отсутствует / должно быть добавлено в сценарий. Ниже приведен код, который использовался для анаглифа стерео и реконструкции сцены, который был адаптирован из учебника по калибровке стереокамеры Matlab.
% Read in the stereo pair of images.
I1 = imread('left.jpg');
I2 = imread('right.jpg');
% Rectify the images.
[J1, J2] = rectifyStereoImages(I1, I2, stereoParams);
% Display the images before rectification.
figure;
imshow(stereoAnaglyph(I1, I2), 'InitialMagnification', 50);
title('Before Rectification');
% Display the images after rectification.
figure;
imshow(stereoAnaglyph(J1, J2), 'InitialMagnification', 50);
title('After Rectification');
%
% Compute Disparity for 3-D Reconstruction
% The distance in pixels between corresponding points in the rectified images is called disparity.
% The disparity is used for 3-D reconstruction, because it is proportional to the distance between the cameras and the 3-D world point.
disparityMap = disparity(rgb2gray(J1), rgb2gray(J2));
figure;
imshow(disparityMap, [0, 64], 'InitialMagnification', 50);
colormap('jet');
colorbar;
title('Disparity Map');
%Reconstruct the 3-D Scene
%Reconstruct the 3-D world coordinates of points corresponding to each pixel from the disparity map.
point3D = reconstructScene(disparityMap, stereoParams);
% Convert from millimeters to meters.
point3D = point3D / 1000;
% Visualize the 3-D Scene
% Plot points between 3 and 7 meters away from the camera.
z = point3D(:, :, 3);
zdisp = z;
point3Ddisp = point3D;
point3Ddisp(:,:,3) = zdisp;
showPointCloud(point3Ddisp, J1, 'VerticalAxis', 'Y',...
'VerticalAxisDir', 'Down' );
xlabel('X');
ylabel('Y');
zlabel('Z');
Я включил изображения реконструкции сцены, карты диспаратности, средней ошибки на пиксель и после выпрямления. Я использую версию Matlab - R2014b Student Edition, приобретенную на веб-сайте Matlab.
2 ответа
У вас есть две проблемы здесь. Во-первых, как отметил @ezfn, искажение объектива может быть слишком сильным. Лучше всего попробовать сделать еще больше калибровочных изображений, чтобы иметь шахматную доску близко к краям и углам поля зрения. Также попробуйте разместить шахматную доску на разных расстояниях от камеры. Посмотрите, сможете ли вы исправить ошибки перепроецирования.
Вторая проблема заключается в том, что вам нужно изменить 'DisparityRange'
параметр disparity
функция. Покажите анаглифное изображение, используя imtool
и используйте виджет линейки для измерения расстояний между некоторыми парами соответствующих точек. Это должно дать вам представление о том, каким должен быть диапазон несоответствия. Просто глядя на изображение, я вижу, что [0 64] слишком мало.
- Я думаю, что самая очевидная проблема здесь заключается в том, что ошибка повторного проецирования (более 3 пикселей), полученная при калибровке стерео, указывает на проблему калибровки. Я бы посоветовал вам выполнить повторную калибровку, чтобы получить меньшую ошибку повторного проецирования (она должна быть значительно ниже 1 пикселя для получения хороших результатов реконструкции).
- Еще один вопрос относительно вашей калибровки: какую модель искажения объектива вы используете? Я полагаю, что у вас есть линзы "рыбий глаз" - я не уверен, что набор инструментов Matlab знает, как с ними справиться.