В этом примере показано, как выполнить угловое обнаружение с помощью алгоритма от ускоренного теста сегмента (FAST) функций. Этот алгоритм является альтернативой примеру детектирования углов методом Харриса. Алгоритм FAST определяет, присутствует ли угол путем тестирования круговой области вокруг потенциального центра угла. Тест обнаруживает угол, если непрерывный раздел пикселей является или более ярким, чем центр плюс порог или более темным, чем центр минус порог.
В реализации программного обеспечения этот алгоритм позволяет, чтобы быстрый тест исключил потенциальные углы, только тестируя четыре пикселя вдоль осей. Алгоритмы программного обеспечения только выполняют полный тест, если быстрый тест передает. Аппаратная реализация может легко выполнить все тесты параллельно, таким образом, быстрый тест не особенно выгоден и не включен в этот пример.
Алгоритм FAST может использоваться во многих размерах или шкалах. Этот пример обнаруживает углы с помощью круга на шестнадцать пикселей. В этих шестнадцати пикселях, если какие-либо двенадцать непрерывных пикселей встречают более яркому или более темному пределу затем, обнаруживается угол.
Система Компьютерного зрения 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 не обнаруживает углы на сгенерированных изображениях компьютера, которые отлично выравниваются к 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. detectFASTFeatures
функция не поддерживает генерацию кода, таким образом, блок MATLAB function должен использовать внешнюю функцию помощника.
Для покадрового визуального сравнения и способности варьироваться контрастный параметр, функция помощника берет входное изображение и минимальный контраст как входные параметры. Это возвращает выходное изображение с зелеными точками, отмечающими обнаруженные углы.
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 должен иметь заданный размер для выходного массива. Быстрый способ задать выходной размер состоит в том, чтобы скопировать вход в выход прежде, чем вызвать функцию помощника. Это - код в блоке MATLAB function:
function Y = fcn(I,minContrast) coder.extrinsic('FASTHelper'); Y = I; Y = FASTHelper(I,minContrast); end
Алгоритм FAST, реализованный в этой модели, тестирует 12 непрерывных пикселей от звонка 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');
Извлекать 7x7
ядро, используйте блок Line Buffer с набором размера окружения к 7x7
. Блок Line Buffer возвращает столбец на семь пикселей и управляющий сигнал, что вы связываете со сдвиговым регистром, чтобы создать 7x7
область. Используйте блок Tapped Delay, чтобы реализовать сдвиговый регистр. Блок Tapped Delay не признает, что вектор ввел, таким образом, модель использует В Каждой подсистеме. Для Каждой подсистемы создает один канал коснувшейся задержки и допускает автоматическое векторное расширение. Выход сдвигового регистра является вектором 49 пикселей, представляющих 7x7
область ядра.
open_system([modelname '/FASTHDLAlgorithm/KernelExtraction'],'force');
Подсистема FASTKernel выбирает центральный пиксель и звонок на 16 пикселей от вектора 49 пикселей, произведенных подсистемой KernelExtraction. Селекторные блоки используют пиксельные индексы, отмеченные выше.
Из-за выбранных индексов существует несколько регистров ядра, которые не нужны в аппаратной реализации. Эти регистры являются сохраненными пикселями после кольцевых пикселей на первых, вторых, шестых, и седьмых линиях ядра. Поскольку их выходные параметры не используются позже в проекте, инструменты синтеза HDL сократят эти регистры от аппаратной реализации.
Затем минимальное контрастное пороговое значение и добавлено к и вычтено из центрального пиксельного значения. Это создает "мертвую зону" или гистерезисную область вокруг центрального пиксельного значения и является ключевой возможностью Алгоритма FAST. Для лучшей аппаратной производительности проект использует конвейерные регистры после сложения и вычитания.
Подсистема затем проверяет кольцевые пиксели на угловые условия, который описан более подробно в следующем разделе.
Подсистема FASTKernel также вычисляет угловую метрику силы использование суммы абсолютной разности (SAD) значение всех пикселей в тестовом звонке, как предложено в [2]. Эта метрика используется в примере, потому что легко реализовать в оборудовании. Позже работайте, вычисляет угловую метрику как самое маленькое изменение в любом значении в звонке, который заставил бы центральную точку не быть углом. Аппаратный алгоритм в модели использует метрику SAD и detectFASTFeatures
функционируйте использует метрику самого маленького изменения, таким образом, будут различия между двумя результатами.
open_system([modelname '/FASTHDLAlgorithm/FASTKernel'],'force');
Следующий шаг, который определит присутствие угла, должен искать все возможные непрерывные сегменты на 12 пикселей звонка, которые имеют значения, или больше, чем или меньше, чем пороговое значение.
В оборудовании можно выполнить все эти сравнения параллельно. Каждый блок компаратора расширяется до 16 компараторов. Выход блока является 16 выборами из двух альтернатив, представляющими каждый сегмент звонка.
AnyCorner блокирует выбор и тестовые области двенадцати непрерывных битов. Существует шестнадцать способов выбрать двенадцать непрерывных битов на звонке: один раздел, который запускается на уровне каждого из кольцевых пикселей. Каждый раздел может представлять угол. Для каждого раздела, блок AnyCorner ANDs биты вместе и затем ORs те результаты определить, существует ли существующий угол.
Модель делает эту проверку и на большее, чем или равняется пути и на меньше, чем или равный пути. Блоки в каждом пути идентичны. Существуют конвейерные регистры при выходе блоков AnyCorner.
open_system([modelname '/FASTHDLAlgorithm/FASTKernel/OneZeroRun'],'force');
Алгоритм FAST идентифицирует многих, много потенциальных углов. Чтобы уменьшать последующую обработку, все углы кроме углов с максимальной угловой метрикой в конкретной области могут быть удалены или подавлены. Существует много алгоритмов для немаксимального подавления, подходящего для реализации программного обеспечения, но немногих подходящих для оборудования. В программном обеспечении используется основанный на градиенте подход, который может быть интенсивно использующим ресурсы в оборудовании. В этой модели простой, но очень эффективный метод должен сравнить угловые метрики в 5x5
ядро и приводит к булеву результату. Булев выход верен, если угловая метрика в центре ядра больше нуля (т.е. это - угол), и также это - максимум всех других угловых метрик в 5x5
область. Большее, чем нуль условие совпадает с установкой minQuality
к 1
для detectFASTFeatures
функция.
Поскольку обработка пиксельного потока слева направо и от начала до конца, результаты содержат некоторые направленные эффекты, такой как, который обнаруженные углы не всегда отлично выравнивают с объектами. Подсистема NonMaxSuppress включает постоянный блок, который позволяет вам отключать подавление и визуализировать полные результаты.
open_system([modelname '/FASTHDLAlgorithm/NonMaxSuppress'],'force');
При выходе подсистемы NonMaxSuppress пиксельный поток включает маркеры для самого сильного угла в каждом 5x5 область. Затем модель перестраивает обнаруженные углы с исходным пиксельным потоком с помощью блока Pixel Stream Aligner. После того, как исходный поток и маркеры выравниваются вовремя, модель накладывает зеленую точку на углах. Подсистема Наложения содержит альфа-микшер с константами для альфа-значений и цвета.
Выходные средства просмотра показывают наложенные зеленые точки для обнаруженных углов. Поведенческий Video Viewer показывает выход detectFastFeatures
функция и HDL Video Viewer показывают выход алгоритма HDL.
minQuality
параметр не используется в этой модели, но мог легко быть передан обоим версии программного и аппаратного обеспечения в качестве параметра. Угловая метрика могла быть изменена от SAD до алгоритма минимального изменения, используемого detectFASTFeatures
, но это было бы менее эффективно для реализации FPGA. Немаксимальный алгоритм подавления мог быть улучшен следующими градиентами и использованием стратегии нескольких-передач, но тот расчет будет также использовать больше аппаратных ресурсов.
В этом примере показано, как начать использовать detectFASTFeatures
в MATLAB и затем перемещаются в Simulink для фрагмента FPGA проекта. Аппаратный алгоритм включает тест звонка вокруг центрального пикселя в ядре и угловую метрику силы. Алгоритм использует немаксимальную функцию подавления, чтобы удалить всех кроме самых сильных обнаруженных углов. Проект затем накладывает угловые местоположения на исходный ввод видео, подсвечивая углы зеленого цвета.
[1] Rosten, E. и Т. Драммонд. "Плавя Точки и Линии для Высокой производительности, Отслеживающей" Продолжения Международной конференции IEEE по вопросам Компьютерного зрения, Издание 2 (октябрь 2005): стр 1508-1511.
[2] Rosten, E. и Т. Драммонд. "Машинное обучение для Высокоскоростного Углового Компьютерного зрения" Обнаружения - Примечания Лекции ECCV 2006 в Информатике, 2006, 430-43. doi:10.1007/11744023_34.