Этот пример показывает, как реализовать однопроходной 8-сторонний алгоритм маркировки компонентов и выполнить анализ больших двоичных объектов.
Blob-анализ является средой компьютерного зрения для обнаружения и анализа связанных пикселей, называемой blobs. Этот алгоритм может оказаться трудным для реализации в потоковом проекте, потому что он обычно включает в себя два или более проходов через изображение. Первый проход выполняет начальную маркировку, и дополнительные проходы соединяют любые шлейфы, не помеченные правильно на первом пассе. Потоковые проекты используют однопроходной алгоритм для применения и объединения меток в оборудовании и хранения статистики больших двоичных объектов в ОЗУ. Этот пример имеет выход этап в программном обеспечении, который читает результаты ОЗУ и накладывает их на вход видео. В этом примере маркируются blobs, и присваивается каждому больших двоичных объектам уникальный идентификатор. Каждый большой двоичный объект рисуется в выходном изображении другим цветом. В примере также вычисляются центроид, ограничивающий прямоугольник и площадь до 1024 маркированных блобов. Модель может поддерживать до 1080p @ 60 видео.
Модель в качестве примера поддерживает совместное проектирование аппаратного и программного обеспечения. Подсистема BlobDetector является аппаратной частью проекта и поддерживает генерацию HDL-кода. За один проход эта подсистема помечает каждый пиксель во входящем потоке пикселей, объединяет связанные области и вычисляет центроид, площадь и ограничивающий прямоугольник для каждого больших двоичных объектов. Выходы подсистемы являются потоком маркированных пикселей. Подсистема хранит статистику больших двоичных объектов в оперативной памяти. Когда анализ больших двоичных объектов завершен, подсистема утверждает, что data_ready выхода порт, чтобы указать, что статистика больших двоичных объектов готова к чтению.
Логика, внешняя по отношению к подсистеме, считывает статистику по одному из ОЗУ BlobDetector с помощью входного порта blobIndex в качестве адреса. Эта внешняя логика представляет программную часть проекта и не поддерживает генерацию HDL-кода. Эта часть проекта считывает центроид, область и ограничивающий прямоугольник каждого больших двоичных объектов, компилирует их в векторы для использования подсистемой Overlay и отображает статистику больших двоичных объектов.
Подсистема BlobDetector обеспечивает эти порты строения, которые могут быть сопоставлены с регистрами AXI для управления программным обеспечением в реальном времени.
GradThresh: Порог, используемый для создания изображения интенсивности.
AreaThresh: Количество пикселей, определяющих больших двоичных объектов. Настройка по умолчанию 1 означает, что все blobs обработаны.
CloseOp: Осуществляется ли морфологическое закрытие перед маркировкой и анализом. Закрытие может быть полезным после порога для заполнения любых введенных отверстий. По умолчанию этот сигнал высок и включает закрытие. Если вы отключаете закрытие, более темная монета обнаруживается как два блоба, а не как один подключенный компонент.
VideoMode: Поток пикселей, возвращаемый подсистемой. Вы можете выбрать вход видео (0), маркированные пиксели (1) или видео интенсивности после порога (2). Вы можете использовать эти различные представления видео для отладки.
Подсистема BlobDetector возвращает выходное видео со связанными управляющими сигналами и ограничивающий прямоугольник, область и центроид для каждого запрошенного blobIndex. Подсистема также имеет эти выходные сигналы, чтобы помочь с отладкой.
index_o: индекс возвращаемой статистики больших двоичных объектов.
num_o: Количество блобов, которые удовлетворяют порогу области.
totalNum_o: Общее количество блобов, обнаруженных в текущей системе координат. Сравнивая num_o и totalNum_o, можно точно настроить порог области входа.
data_ready_o: Указывает, когда статистика больших двоичных объектов для текущей системы координат готова к чтению из ОЗУ. В реализации аппаратного сопроектирования программного обеспечения можно сопоставить этот сигнал с регистром AXI, и программное обеспечение может опрашивать значение регистра, чтобы определить, когда начать чтение статистики.
Подсистема BlobDetector выполняет маркировку и анализ связанных компонентов за один проход по системе координат. На верхнем уровне подсистема содержит CCA_Algorithm подсистему и кэш для результатов. Подсистема CCA_Algorithm выполняет маркировку, вычисление статистики больших двоичных объектов и слияние больших двоичных объектов.
Блок MATLAB function выполняет 8-стороннюю маркировку пикселей относительно текущего пикселя. Возможные метки: предыдущая метка, главная метка, верхняя левая метка и верхняя правая метка. Функция присваивает текущему пикселю существующую метку в порядке приоритета. Если меток нет, а пиксель является пикселем переднего плана, то функция присваивает текущему пикселю новую метку путем увеличения счетчика меток. Функция формирует окно маркировки, как показано на схеме, путем потоковой передачи в текущем пикселе, хранения предыдущей метки в регистре и хранения предыдущей линии пиксельных меток в ОЗУ. Метки, идентифицированные метками labelandmerge, поступают из блока по мере их идентификации. Для получения дополнительной информации об операции слияния см. раздел Логика слияния.
Подсистема cca вычисляет ограничивающий прямоугольник, площадь и центроид каждого больших двоичных объектов. Эта операция использует набор аккумуляторов и ОЗУ.
Подсистема area_accum увеличивает площадь больших двоичных объектов, представленную каждой обнаруженной меткой, путем увеличения адреса ОЗУ, соответствующего метке.
Подсистемы x_accum и y_accum накапливают значения xpos и ypos из портов входа. Значения xpos и ypos являются координатами пикселя во входном кадре. Используя значения площади и накопленные координаты, центроид вычисляется из xaccum/area
и yaccum/area
. В этом вычислении используется взаимная одинарная точность для 1/area
а затем умножает это взаимно на xaccum
и yaccum
для поиска координат центроида. Использование собственной взаимной переменной с плавающей точкой обеспечивает высокую точность и поддерживает высокую динамическую область значений. Когда вы генерируете HDL-код, кодер реализует обратную с помощью логики с фиксированной точкой, а не требует ресурсов с плавающей точкой на FPGA. Для получения дополнительной информации смотрите Начало работы с поддержкой HDL-кодера с плавающей точкой (HDL Coder).
Подсистема bbox_store вычисляет ограничивающий прямоугольник. Подсистема вычисляет левые верхние координаты, ширину и высоту поля путем сравнения координат для каждой метки с ранее кэшированными координатами.
На этапе маркировки каждый пиксель исследуется, используя только текущую линию и предыдущую линию значений меток. Это узкое особое внимание означает, что метки могут потребовать коррекции после того, как будут идентифицированы дальнейшие части больших двоичных объектов. Коррекция меток может быть проблемой как для основанных на кадрах, так и для пиксельных потоковых реализаций. Схемы показывают два примера, когда начальная маркировка требует коррекции.
На схеме слева показан текущий пиксель, соединяющий две области через предыдущую метку и верхнюю правую метку. На схеме справа показан текущий пиксель, соединяющий две области через предыдущую метку и верхнюю метку. Текущий пиксель является первым местом, в котором алгоритм обнаруживает, что требуется слияние. Когда алгоритм обнаруживает слияние, этот пиксель помечается для коррекции. В обеих схемах пиксели являются частью одного и того же больших двоичных объектов, и поэтому каждому пикселю должна быть назначена одна и та же метка, 1
.
Блок MATLAB function проверяет слияния и возвращает uint32
значение, содержащее две объединенные метки. Подсистема MergeQueue хранит все слияния, происходящие в текущей линии. В конце каждой линии подсистема cca считывает значения MergeQueue и корректирует значения площади, центроида и ограничивающего прямоугольника в аккумуляторах. Накопленные значения для двух объединенных меток складываются вместе и присваиваются одной метке. Вход в каждую подсистему аккумулятора имеет мультиплексор 2:1, который позволяет приращивать аккумулятор либо при обнаружении новой метки, либо при возникновении слияния.
В конце каждой системы координат модель обновляет два отображений видео. Видео Результатов On Image отображения показывает входу изображение с наложенными ограничивающими рамками (зеленые прямоугольники) и центроидами (красные кресты). На Метку Изображения видео отображения показаны результаты этапа маркировки перед слиянием. На отображении Label Image верхняя часть каждой монеты имеет отличную метку, чем остальная монета. Этап слияния исправляет это поведение путем объединения двух меток в одну. Ограничительный прямоугольник, возвращенный для каждого больших двоичных объектов, показывает, что каждая монета была обнаружена как одна метка.
Чтобы проверить и сгенерировать HDL-код, на который ссылаются в этом примере, необходимо иметь продукт HDL- Coder™. Чтобы сгенерировать HDL-код, используйте эту команду.
makehdl('BlobAnalysisHDL/BlobDetector')
Сгенерированный код был синтезирован для целевого объекта Xilinx ZC706 SoC. Проект соответствовал ограничению тактовой частоты 200 МГц. Проект использует очень мало аппаратных ресурсов, как показано в таблице.
T = 5x2 table Resource Usage ________ ____________ DSP48 7 (0.78%) Register 4827 (1.1%) LUT 3800 (1.74%) Slice 1507 (2.67%) BRAM 25.5 (4.68%)