Детектирование углов методом FAST

В этом примере показано, как выполнить обнаружение углов с помощью алгоритма FAST. Алгоритм подходит для FPGAs.

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

Алгоритм FAST определяет, присутствует ли угол, путем тестирования круговой области вокруг потенциального центра угла. Тест обнаруживает угол, если смежная секция пикселей либо ярче, чем центр плюс порог, либо темнее, чем центр минус порог. Для другого алгоритма обнаружения углов для FPGA, смотрите Детектирование углов методом Харриса пример.

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

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

MATLAB детектирование углов методом FAST

Компьютерное зрение System Toolbox™ включает алгоритм Детектирования углов методом FAST программного обеспечения в detectFASTFeatures функция. Этот пример использует эту функцию в качестве поведенческой модели для сравнения с проектом алгоритма FAST для оборудования в Simulink ®. Функция имеет параметры для настройки минимальной контрастности и минимального качества.

Параметр минимальной контрастности является пороговым значением, которое складывается или вычитается из значения центрального пикселя перед сравнением с звонком пикселей.

Минимальный параметр качества управляет, какие обнаруженные углы являются «сильными», чтобы быть отмечены как фактические углы. Метрика прочности в исходной бумаге FAST основана на суммировании различий пикселей в круговой области к центральному пикселю [2]. Более поздние версии этого алгоритма используют другую метрику силы, основанную на наименьшем изменении значения пикселя, которое больше не делает обнаружение углом. detectFastFeatures использует метрику наименьшего изменения.

Этот код читает первую систему координат видео, преобразует его в серую шкалу и вызывает detectFASTFeatures. Результатом является вектор угловых расположений. Чтобы отобразить местоположения углов, используйте вектор, чтобы нарисовать яркие зеленые точки над угловыми пикселями в выход системы координат.

v = VideoReader('rhinos.avi');
I = rgb2gray(readFrame(v));
% create output RGB frame
Y = repmat(I,[1 1 3]);
corners = detectFASTFeatures(I,'minContrast',15/255,'minQuality',1/255);
locs = corners.Location;
for ii = 1:size(locs,1)
    Y(floor(locs(ii,2)),floor(locs(ii,1)),2) = 255; % green dot
end
imshow(Y)

Ограничения алгоритма FAST

Другие методы обнаружения углов работают очень по-другому по сравнению с методом FAST и удивительным результатом является то, что FAST не обнаруживает углы на сгенерированных компьютером изображениях, которые идеально выровнены по x и y осей. Поскольку обнаруженный угол должен иметь звонок с более темными или более легкими значениями пикселей вокруг центра, которое включает в себя обоих ребер угла, четкие изображения плохо работают. Например, попробуйте алгоритм FAST на вход изображении, используемом в примере Детектирования углов методом Харриса Харриса.

I = imread('cornerboxes.png');
Ig = rgb2gray(I);
corners = detectFASTFeatures(Ig,'minContrast',15/255,'minQuality',1/255)
corners = 

  0x1 cornerPoints array with properties:

    Location: [0x2 single]
      Metric: [0x1 single]
       Count: 0

Видно, что функция обнаружила нулевые углы. Это происходит из-за того, что алгоритму FAST требуется звонок контрастных пикселей более чем на полпути к центру угла. В изображении, сгенерированном компьютером, оба ребер коробки в углу находятся в звонке пикселей, поэтому тест на угол прекращается. Работа вокруг этой задачи состоит в том, чтобы добавить размытие (путем применения Гауссова фильтра) к изображению, чтобы углы были менее точными, но могут быть обнаружены. После размытия алгоритм FAST теперь обнаруживает более 100 углов.

h = fspecial('gauss',5);
Ig = imfilter(Ig,h);
corners = detectFASTFeatures(Ig,'minContrast',15/255,'minQuality',1/255)
locs = corners.Location;
for ii = 1:size(locs,1)
    I(floor(locs(ii,2)),floor(locs(ii,1)),2) = 255; % green dot
end
imshow(I)
corners = 

  136x1 cornerPoints array with properties:

    Location: [136x2 single]
      Metric: [136x1 single]
       Count: 136

Поведенческая модель для верификации

Модель Simulink использует detectFASTFeatures функция как поведенческая модель для проверки результатов аппаратного алгоритма. Можно использовать блок MATLAB Function, чтобы запустить код MATLAB в Simulink.

modelname = 'FASTCornerHDL';
open_system(modelname);
set_param(modelname,'SampleTimeColors','on');
set_param(modelname,'SimulationCommand','Update');
set_param(modelname,'Open','on');
set(allchild(0),'Visible','off');

Код в блоке MATLAB Function должен либо сгенерировать код С, либо быть объявлен внешним. Внешнее объявление позволяет указанной функции запускаться в MATLAB, в то время как остальная часть блока MATLAB Function запускается в Simulink. The detectFASTFeatures функция не поддерживает генерацию кода, поэтому блок MATLAB Function должен использовать внешнюю вспомогательную функцию.

Для визуального сравнения кадр/кадр и возможности изменения параметра контрастности функция helper принимает вход изображение и минимальную контрастность следующими входами. Оно возвращает выходное изображение с зелеными точками, маркирующими обнаруженные углы.

function Y = FASTHelper(I,minContrast)
Y = I;
corners = detectFASTFeatures(I(:,:,1),'minContrast',double(minContrast)/255,'minQuality',1/255);
locs = corners.Location;
for ii = 1:size(locs,1)
    Y(floor(locs(ii,2)),floor(locs(ii,1)),2) = 255; % green dot
end

end

Блок MATLAB Function должен иметь определенный размер для выхода массива. Быстрый способ задать размер вывода - скопировать вход в выход перед вызовом функции helper. Это код внутри блока MATLAB Function:

function Y = fcn(I,minContrast)
    coder.extrinsic('FASTHelper');
    Y = I;
    Y = FASTHelper(I,minContrast);
end

Реализация для HDL

Алгоритм FAST, реализованный в блоке Vision HDL Corner Detector Toolbox в этой модели, проверяет 9 смежных пикселей из звонка в 16 пикселей и сравнивает их значения с значением центрального пикселя. Ядро 7x7 пиксели вокруг каждого тестового пикселя включают 16-пиксельный звонок. Схема показывает центральный пиксель и звонок на 16 пикселей вокруг него, которое используется для теста. Пиксели звонка, по часовой стрелке от верхней-средней, являются

  indices = [22 29 37 45 46 47 41 35 28 21 13 5 4 3 9 15];

Эти индексы пикселей используются для выбора и сравнения. Порядок должен быть непрерывным, но звонок может начаться в любой точке.

После вычисления угловых метрик, используя эти звонки пикселей, алгоритм определяет максимальную угловую метрику в каждой области и подавляет другие обнаруженные углы. Затем модель накладывает не подавленные угловые маркеры на исходное входное изображение.

Аппаратный алгоритм находится в подсистеме FASTHDLAlgorithm. Эта подсистема поддерживает генерацию HDL-кода.

open_system([modelname '/FASTHDLAlgorithm'],'force');

Обнаружение углов

Чтобы определить наличие угла, проверьте все возможные 9-пиксельные смежные сегменты звонка, которые имеют значения, большие или меньше порогового значения.

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

Немыслимое подавление

Алгоритм FAST определяет много, много потенциальных углов. Чтобы уменьшить последующую обработку, все углы, кроме углов с максимальной угловой метрикой в конкретной области, могут быть удалены или подавлены. Существует много алгоритмов для не максимального подавления, подходящих для реализации ПО, но мало подходящих для оборудования. В программном обеспечении используется основанный на градиентах подход, который может быть ресурсоемким в оборудовании. В этой модели простой, но очень эффективный метод состоит в том, чтобы сравнить угловые метрики в 5x5 ядро и получите логический результат. Логический выход равен true, если угловая метрика в центре ядра больше нуля (то есть это угол), а также это максимум всех других угловых метрик в 5x5 область. Условие «больше нуля» соответствует настройке minQuality на 1 для detectFASTFeatures функция.

Поскольку обработка потока пикселей происходит слева направо и сверху вниз, результаты содержат некоторые эффекты направления, такие как то, что обнаруженные углы не всегда идеально совпадают с объектами. Подсистема NonMaxSuppress включает в себя постоянный блок, который позволяет отключать подавление и визуализировать полные результаты.

open_system([modelname '/FASTHDLAlgorithm/NonMaxSuppress'],'force');

Выравнивание и наложение

На выходе подсистемы NonMaxSuppress поток пикселей включает маркеры для самого сильного угла в каждой области 5x5. Затем модель перестраивает обнаруженные углы с исходным потоком пикселей с помощью блока Pixel Stream Aligner. После того, как исходный поток и маркеры выровнены по времени, модель накладывает зеленую точку на углы. Подсистема Overlay содержит альфа-миксер с константами для значений цвета и альфа.

На выход средств просмотра показаны наложенные зеленые точки для обнаруженных углов. Behavioral Video Viewer показывает выходы detectFastFeatures функция, и HDL Video Viewer показывает выход алгоритма HDL.

Дальнейший переход

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

Заключение

В этом примере показано, как начать использовать detectFASTFeatures в MATLAB и затем перейдите в Simulink для фрагмента проекта FPGA. Аппаратный алгоритм в блоке Corner Detector включает в себя тест звонка вокруг центрального пикселя в ядре и метрику прочности угла. Модель использует не максимальную функцию подавления, чтобы удалить все, кроме самых сильных обнаруженных углов. Затем проект перекрывает угловые местоположения на исходные видео- входы, подсвечивая углы зеленым цветом.

Ссылки

[1] Ростен, Э. и Т. Драммонд. «Fusing Точек and Линий for High Эффективности Tracking» Products of the IEEE International Conference on Computer Vision, Vol. 2 (October 2005): pp. 1508-1511.

[2] Ростен, Э. и Т. Драммонд. «Машинное обучение для высокоскоростного обнаружения углов» Компьютерное Зрение - ECCV 2006 Lecture Notes in Computer Science, 2006, 430-43. doi:10.1007/11744023_34.