В этом примере показано, как обнаружить конкретный объект в загроможденной сцене с учетом опорного изображения объекта.
В этом примере представлен алгоритм обнаружения конкретного объекта на основе соответствий точек поиска между опорным и целевым изображением. Он может обнаруживать объекты, несмотря на изменение масштаба или поворот в плоскости. Она также устойчива к небольшой степени внепланового вращения и окклюзии.
Этот метод обнаружения объектов лучше всего подходит для объектов с неповторяющимися текстурными шаблонами, которые приводят к уникальным совпадениям элементов. Этот метод вряд ли будет хорошо работать для однородно окрашенных объектов или для объектов, содержащих повторяющиеся узоры. Следует отметить, что этот алгоритм предназначен для обнаружения конкретного объекта, например, слона на опорном изображении, а не любого слона. Для обнаружения объектов определенной категории, таких как пользователи или лица, см. раздел vision.PeopleDetector и vision.CascadeObjectDetector.
Прочитайте ссылочное изображение, содержащее интересующий объект.
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');

Обнаружение точек элементов на обоих изображениях.
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));

Извлеките дескрипторы элементов в точках начисления процентов на обоих изображениях.
[boxFeatures, boxPoints] = extractFeatures(boxImage, boxPoints); [sceneFeatures, scenePoints] = extractFeatures(sceneImage, scenePoints);
Сопоставьте элементы с помощью их дескрипторов.
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)');

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');

Определите второй объект с помощью тех же шагов, что и ранее.
Чтение изображения, содержащего второй интересующий объект.
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');
