exponenta event banner

Обнаружение объектов в загроможденной сцене с помощью сопоставления элементов точек

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

Обзор

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

Этот метод обнаружения объектов лучше всего подходит для объектов с неповторяющимися текстурными шаблонами, которые приводят к уникальным совпадениям элементов. Этот метод вряд ли будет хорошо работать для однородно окрашенных объектов или для объектов, содержащих повторяющиеся узоры. Следует отметить, что этот алгоритм предназначен для обнаружения конкретного объекта, например, слона на опорном изображении, а не любого слона. Для обнаружения объектов определенной категории, таких как пользователи или лица, см. раздел vision.PeopleDetector и vision.CascadeObjectDetector.

Шаг 1: Чтение изображений

Прочитайте ссылочное изображение, содержащее интересующий объект.

boxImage = imread('stapleRemover.jpg');
figure;
imshow(boxImage);
title('Image of a Box');

Чтение целевого изображения, содержащего загроможденную сцену.

sceneImage = imread('clutteredDesk.jpg');
figure;
imshow(sceneImage);
title('Image of a Cluttered Scene');

Шаг 2: Определение точек элемента

Обнаружение точек элементов на обоих изображениях.

boxPoints = detectSURFFeatures(boxImage);
scenePoints = detectSURFFeatures(sceneImage);

Визуализация наиболее сильных точек элемента, найденных на ссылочном изображении.

figure;
imshow(boxImage);
title('100 Strongest Feature Points from Box Image');
hold on;
plot(selectStrongest(boxPoints, 100));

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

figure;
imshow(sceneImage);
title('300 Strongest Feature Points from Scene Image');
hold on;
plot(selectStrongest(scenePoints, 300));

Шаг 3: Извлечение дескрипторов функций

Извлеките дескрипторы элементов в точках начисления процентов на обоих изображениях.

[boxFeatures, boxPoints] = extractFeatures(boxImage, boxPoints);
[sceneFeatures, scenePoints] = extractFeatures(sceneImage, scenePoints);

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

Сопоставьте элементы с помощью их дескрипторов.

boxPairs = matchFeatures(boxFeatures, sceneFeatures);

Отображение предположительно совпадающих элементов.

matchedBoxPoints = boxPoints(boxPairs(:, 1), :);
matchedScenePoints = scenePoints(boxPairs(:, 2), :);
figure;
showMatchedFeatures(boxImage, sceneImage, matchedBoxPoints, ...
    matchedScenePoints, 'montage');
title('Putatively Matched Points (Including Outliers)');

Шаг 5: Поиск объекта в сцене с помощью предполагаемых совпадений

estimateGeometricTransform2D вычисляет преобразование, относящееся к согласованным точкам, при исключении отклонений. Это преобразование позволяет локализовать объект в сцене.

[tform, inlierIdx] = ...
    estimateGeometricTransform2D(matchedBoxPoints, matchedScenePoints, 'affine');
inlierBoxPoints   = matchedBoxPoints(inlierIdx, :);
inlierScenePoints = matchedScenePoints(inlierIdx, :);

Отображение совпадающих пар точек с удаленными отклонениями

figure;
showMatchedFeatures(boxImage, sceneImage, inlierBoxPoints, ...
    inlierScenePoints, 'montage');
title('Matched Points (Inliers Only)');

Получение ограничивающего многоугольника ссылочного изображения.

boxPolygon = [1, 1;...                           % top-left
        size(boxImage, 2), 1;...                 % top-right
        size(boxImage, 2), size(boxImage, 1);... % bottom-right
        1, size(boxImage, 1);...                 % bottom-left
        1, 1];                   % top-left again to close the polygon

Преобразуйте многоугольник в систему координат целевого изображения. Преобразованный многоугольник указывает местоположение объекта в сцене.

newBoxPolygon = transformPointsForward(tform, boxPolygon);

Отображение обнаруженного объекта.

figure;
imshow(sceneImage);
hold on;
line(newBoxPolygon(:, 1), newBoxPolygon(:, 2), 'Color', 'y');
title('Detected Box');

Шаг 7: Обнаружение другого объекта

Определите второй объект с помощью тех же шагов, что и ранее.

Чтение изображения, содержащего второй интересующий объект.

elephantImage = imread('elephant.jpg');
figure;
imshow(elephantImage);
title('Image of an Elephant');

Обнаружение и визуализация точек элемента.

elephantPoints = detectSURFFeatures(elephantImage);
figure;
imshow(elephantImage);
hold on;
plot(selectStrongest(elephantPoints, 100));
title('100 Strongest Feature Points from Elephant Image');

Извлечь дескрипторы элементов.

[elephantFeatures, elephantPoints] = extractFeatures(elephantImage, elephantPoints);

Сопоставить элементы

elephantPairs = matchFeatures(elephantFeatures, sceneFeatures, 'MaxRatio', 0.9);

Отображение предположительно совпадающих элементов.

matchedElephantPoints = elephantPoints(elephantPairs(:, 1), :);
matchedScenePoints = scenePoints(elephantPairs(:, 2), :);
figure;
showMatchedFeatures(elephantImage, sceneImage, matchedElephantPoints, ...
    matchedScenePoints, 'montage');
title('Putatively Matched Points (Including Outliers)');

Оценка геометрического преобразования и устранение отклонений

[tform, inlierElephantPoints, inlierScenePoints] = ...
    estimateGeometricTransform(matchedElephantPoints, matchedScenePoints, 'affine');
figure;
showMatchedFeatures(elephantImage, sceneImage, inlierElephantPoints, ...
    inlierScenePoints, 'montage');
title('Matched Points (Inliers Only)');

Показать оба объекта

elephantPolygon = [1, 1;...                                 % top-left
        size(elephantImage, 2), 1;...                       % top-right
        size(elephantImage, 2), size(elephantImage, 1);...  % bottom-right
        1, size(elephantImage, 1);...                       % bottom-left
        1,1];                         % top-left again to close the polygon

newElephantPolygon = transformPointsForward(tform, elephantPolygon);

figure;
imshow(sceneImage);
hold on;
line(newBoxPolygon(:, 1), newBoxPolygon(:, 2), 'Color', 'y');
line(newElephantPolygon(:, 1), newElephantPolygon(:, 2), 'Color', 'g');
title('Detected Elephant and Box');