В этом примере показано, как использовать обнаружение ребра в качестве первого шага в угловом обнаружении. Алгоритм подходит для FPGAs.
Угловое обнаружение используется в системах компьютерного зрения, чтобы найти функции в изображении. Это часто - один из первых шагов в приложениях как обнаружение движения, отслеживание, регистрация изображений и алгоритм распознавания.
Угол интуитивно задан как пересечение двух ребер. Этот пример использует алгоритм Harris & Stephens [1], в котором расчет упрощен с помощью приближения собственных значений матрицы Харриса. Для другого углового алгоритма обнаружения для FPGAs смотрите пример Детектирования углов методом FAST.
Эта модель в качестве примера предоставляет аппаратно-совместимый алгоритм. Можно реализовать этот алгоритм на плате с помощью исходного проекта Xilinx™ Zynq™. Смотрите Угловое Наложение Обнаружения и Изображения с Находящимся в Zynq Оборудованием (Пакет поддержки Vision HDL Toolbox для Xilinx Находящееся в Zynq Оборудование).
Систему CornerDetectionHDL.slx показывают ниже. Угловая подсистема Алгоритма HDL содержит блок Corner Detector с набором параметров Метода к Harris
.
Первый шаг в алгоритме Харриса должен найти ребра в изображении. Блок Corner Detector использует два фильтра градиента изображений с коэффициентами и произвести градиенты и. Квадрат и перекрестный умножается, чтобы сформироваться, и.
Второй шаг алгоритма должен выполнить Гауссову фильтрацию к среднему значению, и по круговому окну. Размер кругового окна определяет шкалу обнаруженного угла. Блок использует 5x5 окно. Для трех компонентов блок использует три фильтра с теми же коэффициентами фильтра.
Последний шаг алгоритма должен оценить собственное значение матрицы Харриса. Матрица Харриса является симметрической матрицей, похожей на ковариационную матрицу. Основная диагональ состоит из двух средних значений градиентов, в квадрате и. От диагональных элементов средние значения векторного произведения градиента. Матрица Харриса:
Ключевое упрощение алгоритма Харриса оценивает собственные значения матрицы Харриса, когда определитель минус масштабированная трассировка придал квадратную форму.
где обычно константа 0.04.
Угловой метрический ответ, описанное использование градиентов:
Когда ответ больше, чем предопределенный порог, угол обнаруживается:
Полная функция от входного изображения, чтобы вывести угловой метрический ответ является полиномом четвертого порядка. Это приводит к некоторым проблемам, определяющим фиксированную точку, масштабирующуюся для каждого шага расчета. Поскольку мы предназначаемся для FPGAs со встроенными множителями, лучшая стратегия состоит в том, чтобы позволить рост разрядности, пока размер множителя не достигнут, и затем начните квантовать результаты на выборочном базисе, чтобы остаться в границах обеспеченных множителей.
Поток входного пикселя является 8-битными полутоновыми пиксельными данными. Вычисление градиентов не добавляет много роста разрядности, поскольку ядро фильтра имеет только +1 и-1 коэффициент. Результатом является полная точность 9-битная фиксированная точка со знаком.
Обработка на квадрат и перекрестное умножение градиентов приводят к подписанным 18-битным результатам, все еще в полной точности. Много общих множителей FPGA имеют 18-битный или 20-битный вход wordlengths, таким образом, необходимо будет квантовать на следующем шаге.
Следующий шаг должен применить круговое окно к этим трем компонентам с помощью трех Фильтров Изображений с Гауссовыми коэффициентами. Коэффициенты квантуются к 18-битным числам без знака, чтобы соответствовать множителям FPGA. Чтобы найти лучшую дробную точность для коэффициентов, создайте номер фиксированной точки с помощью fi () функция, но только задав wordlength. В этом случае дробное масштабирование 21 бита является лучшим, поскольку самое большое значение в матрице коэффициентов между 1/8 и 1/16.
coeffs = fi(fspecial('gaussian',[5,5],1.5),0,18)
coeffs = 0.0144 0.0281 0.0351 0.0281 0.0144 0.0281 0.0547 0.0683 0.0547 0.0281 0.0351 0.0683 0.0853 0.0683 0.0351 0.0281 0.0547 0.0683 0.0547 0.0281 0.0144 0.0281 0.0351 0.0281 0.0144 DataTypeMode: Fixed-point: binary point scaling Signedness: Unsigned WordLength: 18 FractionLength: 21
Вы видите, что получившиеся изображения от симуляции очень похожи, но не точно то же самое. Небольшие различия в результатах симуляции - то, потому что поведенческая модель использует целочисленные арифметические правила C, и квантование отличается от готового к HDL углового блока обнаружения.
Используя Simulink, можно изучить эти различия и решить, допустимы ли ошибки для приложения. Если они не приемлемы, можно увеличить битные ширины операторов, несмотря на то, что это увеличивает область, используемую в FPGA.
Проверять и сгенерировать HDL-код сослались в этом примере, у вас должна быть лицензия HDL Coder™.
Чтобы сгенерировать HDL-код, используйте следующую команду.
makehdl('CornerDetectionHDL/HDL Corner Algorithm')
Чтобы сгенерировать испытательный стенд, используйте следующую команду. Обратите внимание на то, что генерация испытательного стенда занимает много времени из-за большого размера данных. Можно хотеть уменьшать время симуляции прежде, чем сгенерировать испытательный стенд.
makehdltb('CornerDetectionHDL/HDL Corner Algorithm')
Часть этой модели, которую можно реализовать на FPGA, является частью между Системой координат К Пикселям и Пикселями, Чтобы Структурировать блоки. Это - названный Угловой Алгоритм HDL подсистемы, который включает все элементы углового алгоритма обнаружения, замеченного выше. Остальная часть модели, включая Поведенческий Угловой Алгоритм и источники и приемники, формирует наш испытательный стенд Simulink.
Алгоритм Harris & Stephens основан на аппроксимации собственных значений матрицы Харриса как показано выше. Алгоритм Харриса использует в качестве метрики, избегая любого деления или операций квадратного корня. Другой способ сделать угловое обнаружение состоит в том, чтобы вычислить фактические собственные значения.
Аналитическое решение для собственных значений 2x2 матрица известна и может также использоваться в угловом обнаружении. Когда собственные значения являются и положительными и большими с той же шкалой, угол был найден.
При замене в наших значениях мы добираемся:
Для реализации FPGA важно заметить повторное значение. Мы можем вычислить это значение однажды и затем квадрат, чтобы объединиться с. Это означает, что алгоритм собственного значения требует только двух множителей, но за счет большего количества сумматоров и вычитающих устройств и функции квадратного корня, которая требует нескольких множителей самостоятельно.
Необходимо затем сравнить оба собственных значения с постоянным значением, чтобы убедиться, что они являются большими. Поскольку собственные значения масштабируют с интенсивностью изображений, также необходимо убедиться, что они оба вокруг того же размера. Можно сделать это путем вычитания один от другого и проверки, что результат меньше, чем некоторое предопределенное пороговое значение. Заметьте, что в этом вычитании, первые термины уравновешиваются, и с вами оставляют:
Можно перестроить это так, чтобы это было очень похоже на метрику Харриса выше:
Расширение матрицы дает:
Подобие между различием собственных значений и метрикой Харриса показывает, как приближение Харриса работает. Если вы перестраиваете термины под квадратным корнем и подкачиваете знаки, таким образом, результат должен быть больше или равен предопределенному порогу, вы прибываете в по существу метрику Харриса с некоторым масштабированием.
[1] К. Харрис и М. Стивенс (1988). "Объединенный угол и детектор ребра". Продолжения 4-й Конференции по Видению Alvey. стр 147-151.