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

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

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

Шаг 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 Constraint

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

[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; Верри, А. «Вводные методы для 3-D компьютерного зрения». Prentice Hall, 1998.

[2] Hartley, R; Циссерман, А. «Множественная геометрия вида в компьютерном зрении». Cambridge University Press, 2003.

[3] Hartley, R. «In Defense of the Eight-Point Algorithm». Транзакции IEEE ® по анализу шаблонов и машинному анализу, v.19 n.6, июнь 1997 года.

[4] Фишлер, МА; Боллес, RC. Random Sample Consensus: A Paradigm for Model Fitting with Applications to Image Analysis and Automated Cartography (неопр.) (недоступная ссылка). Комм. ACM 24, июнь 1981.