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

Правильно согласованные точки должны удовлетворять эпиполярным ограничениям. Это означает, что точка должна лежать на эпиполярной прямой, определяемой соответствующей ей точкой. Вы будете использовать estimateFundamentalMatrix функция для вычисления фундаментальной матрицы и поиска вложенных элементов, удовлетворяющих эпиполярному ограничению.
[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; Верри, А. «Вводные методики 3-D компьютерного зрения». Прентис Холл, 1998.
[2] Хартли, R; Зиссерман, А. «Геометрия множественного вида в компьютерном зрении». Издательство Кембриджского университета, 2003 год.
[3] Хартли, Р. «В защиту восьмибалльного алгоритма». IEEE ® Transactions on Pattern Analysis and Machine Intelligence, v.19 n.6, июнь 1997 г.
[4] Фишлер, МА; Боллес, RC. «Консенсус случайных выборок: парадигма подгонки модели с приложениями для анализа изображений и автоматизированной картографии». Комм. ACM 24, июнь 1981.