Некалиброванное исправление стереоизображения

Этот пример показывает, как использовать estimateFundamentalMatrix, estimateUncalibratedRectification и функции detectSURFFeatures, чтобы вычислить исправление двух некалиброванных изображений, где камера intrinsics неизвестна.

Исправление стереоизображения проецирует изображения на общую плоскость изображения таким способом, которым соответствующие точки имеют те же координаты строки. Этот процесс полезен для видения стерео, потому что 2D проблема соответствия стерео уменьшается до 1D проблемы. Как пример, исправление стереоизображения часто используется в качестве шага предварительной обработки для вычислительной несоизмеримости или создания изображений анаглифа.

Шаг 1: считайте пару стереоизображения

Читайте в двух цветных изображениях той же сцены, которые были взяты из различных положений. Затем преобразуйте их в шкалу полутонов. Цвета не требуются для процесса соответствия.

I1 = imread('yellowstone_left.png');
I2 = imread('yellowstone_right.png');

% Convert to grayscale.
I1gray = rgb2gray(I1);
I2gray = rgb2gray(I2);

Отобразите оба изображения рядом. Затем отобразите цветной составной объект, демонстрирующий мудрые пикселем различия между изображениями.

figure;
imshowpair(I1, I2,'montage');
title('I1 (left); I2 (right)');
figure;
imshow(stereoAnaglyph(I1,I2));
title('Composite Image (Red - Left Image, Cyan - Right Image)');

Существует очевидное смещение между изображениями в ориентации и положении. Цель исправления состоит в том, чтобы преобразовать изображения, выровняв их таким образом, что соответствующие точки появятся на тех же строках в обоих изображениях.

Шаг 2: соберите точки интереса из каждого изображения

Процесс исправления требует набора соответствий точки между двумя изображениями. Чтобы сгенерировать эти соответствия, вы соберете интересные места из обоих изображений, и затем выберете потенциальные соответствия между ними. Используйте detectSURFFeatures, чтобы найти подобные блобу функции в обоих изображениях.

blobs1 = detectSURFFeatures(I1gray, 'MetricThreshold', 2000);
blobs2 = detectSURFFeatures(I2gray, 'MetricThreshold', 2000);

Визуализируйте местоположение и шкалу тридцати самых сильных функций SURF в I1 и I2. Заметьте, что не все обнаруженные функции могут быть соответствующими, потому что они не были или обнаружены в обоих изображениях или потому что некоторые из них не присутствовали в одном из изображений из-за движения камеры.

figure;
imshow(I1);
hold on;
plot(selectStrongest(blobs1, 30));
title('Thirty strongest SURF features in I1');

figure;
imshow(I2);
hold on;
plot(selectStrongest(blobs2, 30));
title('Thirty strongest SURF features in I2');

Шаг 3: найдите предполагаемые соответствия точки

Используйте extractFeatures и функции matchFeatures, чтобы найти предполагаемые соответствия точки. Для каждого блоба вычислите характеристические векторы SURF (дескрипторы).

[features1, validBlobs1] = extractFeatures(I1gray, blobs1);
[features2, validBlobs2] = extractFeatures(I2gray, blobs2);

Используйте сумму абсолютных разностей (SAD) метрика, чтобы определить индексы соответствия с функциями.

indexPairs = matchFeatures(features1, features2, 'Metric', 'SAD', ...
  'MatchThreshold', 5);

Получите местоположения совпадающих точек для каждого изображения.

matchedPoints1 = validBlobs1(indexPairs(:,1),:);
matchedPoints2 = validBlobs2(indexPairs(:,2),:);

Покажите соответствие с точками сверху составного изображения, которое комбинирует стереоизображения. Заметьте, что большинство соответствий правильно, но существуют все еще некоторые выбросы.

figure;
showMatchedFeatures(I1, I2, matchedPoints1, matchedPoints2);
legend('Putatively matched points in I1', 'Putatively matched points in I2');

Шаг 4: удалите выбросы Используя ограничение Epipolar

Правильно совпадающие точки должны удовлетворить epipolar ограничения. Это означает, что точка должна лечь на epipolar строку, определенную ее соответствующей точкой. Вы будете использовать функцию estimateFundamentalMatrix, чтобы вычислить основную матрицу и найти inliers, которые соответствуют epipolar ограничению.

[fMatrix, epipolarInliers, status] = estimateFundamentalMatrix(...
  matchedPoints1, matchedPoints2, 'Method', 'RANSAC', ...
  'NumTrials', 10000, 'DistanceThreshold', 0.1, 'Confidence', 99.99);

if status ~= 0 || isEpipoleInImage(fMatrix, size(I1)) ...
  || isEpipoleInImage(fMatrix', size(I2))
  error(['Either not enough matching points were found or '...
         'the epipoles are inside the images. You may need to '...
         'inspect and improve the quality of detected features ',...
         'and/or improve the quality of your images.']);
end

inlierPoints1 = matchedPoints1(epipolarInliers, :);
inlierPoints2 = matchedPoints2(epipolarInliers, :);

figure;
showMatchedFeatures(I1, I2, inlierPoints1, inlierPoints2);
legend('Inlier points in I1', 'Inlier points in I2');

Шаг 5: исправьте изображения

Используйте функцию estimateUncalibratedRectification, чтобы вычислить преобразования исправления. Они могут использоваться, чтобы преобразовать изображения, такие, что соответствующие точки появятся на тех же строках.

[t1, t2] = estimateUncalibratedRectification(fMatrix, ...
  inlierPoints1.Location, inlierPoints2.Location, size(I2));
tform1 = projective2d(t1);
tform2 = projective2d(t2);

Исправьте стереоизображения и отобразите их как анаглиф стерео. Можно использовать красно-голубые стекла стерео, чтобы видеть 3D эффект.

[I1Rect, I2Rect] = rectifyStereoImages(I1, I2, tform1, tform2);
figure;
imshow(stereoAnaglyph(I1Rect, I2Rect));
title('Rectified Stereo Images (Red - Left Image, Cyan - Right Image)');

Шаг 6: обобщите процесс исправления

Параметры, используемые в перечисленных выше шагах, были установлены, чтобы соответствовать двум конкретным стереоизображениям. Чтобы обработать другие изображения, можно использовать функцию cvexRectifyStereoImages, которая содержит дополнительную логику, чтобы автоматически настроить параметры исправления. Изображение ниже показов результат обработки пары изображений с помощью этой функции.

cvexRectifyImages('parkinglot_left.png', 'parkinglot_right.png');

Ссылки

[1] Trucco, E; Verri, A. "Вводные методы для 3-D компьютерного зрения". Prentice Hall, 1998.

[2] Хартли, R; Зиссермен, A. "Несколько просматривают геометрию в компьютерном зрении". Издательство Кембриджского университета, 2003.

[3] Хартли, R. "В защиту Алгоритма С восемью точками". IEEE® Transactions согласно Анализу Шаблона и Искусственному интеллекту, v.19 n.6, июнь 1997.

[4] Fischler, MA; Боллс, RC. "Согласие случайной выборки: парадигма для модели, соответствующей приложениям к анализу изображения и автоматизированной картографии". Коммуникация ACM 24, июнь 1981.

Для просмотра документации необходимо авторизоваться на сайте