Этот пример показывает, как выполнить угловое обнаружение с помощью алгоритма от ускоренного теста сегмента (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 не обнаруживает углы на сгенерированных изображениях компьютера, которые отлично выравниваются к осям y
и x
. Поскольку обнаруженный угол должен иметь звонок более темных или более легких пиксельных значений вокруг центра, который включает оба ребра угла, четкие изображения не работают хорошо. Например, попробуйте Алгоритм 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.