В этом примере показано, как использовать estimateFundamentalMatrix
, estimateUncalibratedRectification
, и detectSURFFeatures
функции, чтобы вычислить исправление двух некалиброванных изображений, где внутренние параметры камеры неизвестны.
Исправление стереоизображения проецирует изображения на общую плоскость изображения таким способом, которым соответствующие точки имеют те же координаты строки. Этот процесс полезен для видения стерео, потому что 2D проблема соответствия стерео уменьшается до 1D проблемы. Как пример, исправление стереоизображения часто используется в качестве шага предварительной обработки для вычислительной несоизмеримости или создания изображений анаглифа.
Читайте в двух цветных изображениях той же сцены, которые были взяты из различных положений. Затем преобразуйте их в шкалу полутонов. Цвета не требуются для процесса соответствия.
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)');
Существует очевидное перемещение между изображениями в ориентации и положении. Цель исправления состоит в том, чтобы преобразовать изображения, выровняв их таким образом, что соответствующие точки появятся на тех же строках в обоих изображениях.
Процесс исправления требует набора соответствий точки между двумя изображениями. Чтобы сгенерировать эти соответствия, вы соберете интересные места из обоих изображений, и затем выберете потенциальные соответствия между ними. Используйте 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');
Используйте 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');
Правильно совпадающие точки должны удовлетворить 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');
Используйте 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)');
Параметры, используемые в перечисленных выше шагах, были установлены, чтобы соответствовать двум конкретным стереоизображениям. Чтобы обработать другие изображения, можно использовать 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.