В этом примере показано, как реализовать однопроходный соединенный с 8 путями - алгоритм маркировки компонента и выполнить анализ блоба.
Blob-анализ является средой компьютерного зрения для обнаружения, и анализ связанных пикселей вызвал блобы. Этот алгоритм может быть сложным, чтобы реализовать в проекте потоковой передачи, потому что он обычно включает два или больше, проходит через изображение. Первая передача выполняет начальную маркировку, и дополнительные передачи соединяют любые блобы, не помеченные правильно на первой передаче. Потоковая передача проектов использует однопроходный алгоритм, чтобы применить и объединить метки в оборудовании и статистику блоба хранилища в RAM. Этот пример имеет выходной каскад в программном обеспечении, которое читает, RAM заканчивается и накладывает их на входное видео. Этот пример помечает блобы и присваивает каждый блоб уникальный идентификатор. Каждый блоб чертится в различном цвете в выходном изображении. Пример также вычисляет центроид, ограничительную рамку и область до 1 024 помеченных блобов. Модель может поддержать до видео 1080p@60.
Модель в качестве примера поддерживает элемент кода аппаратного программного обеспечения. Подсистема BlobDetector является аппаратной частью проекта и поддерживает генерацию HDL-кода. В одной передаче эта подсистема помечает каждый пиксель во входящем пиксельном потоке, объединяет соединенные области и вычисляет центроид, область и ограничительную рамку для каждого блоба. Выход подсистемы является потоком помеченных пикселей. Подсистема хранит статистику блоба в RAM. Когда анализ блоба завершен, подсистема утверждает data_ready выходной порт, чтобы указать, что статистические данные блоба готовы быть считанными.
Логика, внешняя к подсистеме, читает статистику по одному из BlobDetector RAM при помощи blobIndex входного порта как адрес. Эта внешняя логика представляет программную часть проекта и не поддерживает генерацию HDL-кода. Эта часть проекта читает центроид, область, и ограничительную рамку каждого блоба, компилирует их в векторы для использования подсистемой Наложения и отображает статистику блоба.
Подсистема BlobDetector обеспечивает эти конфигурационные порты, которые могут быть сопоставлены с регистрами AXI для управления программным обеспечением реального времени.
GradThresh: Порог раньше создавал изображение интенсивности.
AreaThresh: Количество пикселей, которые задают блоб. Настройка по умолчанию 1 среднего значения, что все блобы обрабатываются.
CloseOp: Выполняется ли морфологическое закрытие до маркировки и анализа. Закрытие может быть полезным после пороговой обработки, чтобы заполнить любые введенные отверстия. По умолчанию этот сигнал высок и позволяет закрыться. Если вы отключаете закрытие, более темная монета обнаруживается как два блоба, а не один связанный компонент.
VideoMode: Пиксельный поток возвращен подсистемой. Можно выбрать входное видео (0), помеченные пиксели (1), или видео интенсивности после пороговой обработки (2). Можно использовать эти различные видео представления для отладки.
Подсистема BlobDetector возвращает выходное видео со связанными управляющими сигналами, и ограничительную рамку, область, и центроид для каждого запросил blobIndex. Подсистема также имеет эти выходные сигналы, чтобы помочь с отладкой.
index_o: индекс блоба, в настоящее время возвращающего статистику.
num_o: Количество блобов, которые соответствуют порогу области.
totalNum_o: Общее количество блобов обнаруживается в текущей системе координат. Путем сравнения num_o и totalNum_o, можно подстроить входной порог области.
data_ready_o: Указывает, когда статистические данные блоба для текущей системы координат готовы быть считанными из RAM. В реализации элемента кода аппаратного программного обеспечения можно сопоставить этот сигнал с регистром AXI, и программное обеспечение может опросить значение регистра, чтобы определить, когда начать читать статистику.
Подсистема BlobDetector выполняет соединенную маркировку компонента и анализ в одной передаче по системе координат. В верхнем уровне подсистема содержит подсистему CCA_Algorithm и кэш для результатов. Подсистема CCA_Algorithm выполняет маркировку, вычисление статистики блоба и слияние блоба.
labelandmerge блок MATLAB function выполняет пиксельную маркировку с 8 путями относительно текущего пикселя. Возможные метки: предыдущая метка, главная метка, верхняя левая метка и верхняя правая метка. Функция присваивает текущий пиксель существующая метка в порядке приоритета. Если никакие метки не существуют, и пиксель является приоритетным пикселем, то функция присваивает новую метку текущему пикселю путем постепенного увеличения счетчика метки. Функция формирует окно маркировки как показано в схеме путем потоковой передачи в текущем пикселе, хранения предыдущей метки в регистре и хранения предыдущей линии пиксельных меток в RAM. Метки, идентифицированные labelandmerge, передаются потоком из блока, когда они идентифицированы. Для получения дополнительной информации операции слияния, смотрите раздел Merge Logic.
cca подсистема вычисляет ограничительную рамку, область и центроид каждого блоба. Эта операция использует набор аккумуляторов и RAM.
area_accum подсистема постепенно увеличивает область блоба, представленного каждой обнаруженной меткой путем постепенного увеличения адреса RAM, соответствующего метке.
x_accum и y_accum подсистемы накапливают xpos и ypos значения от входных портов. xpos и ypos значения являются координатами пикселя во входном кадре. Используя значения области и накопленные координаты, центроид вычисляется от xaccum/area
и yaccum/area
. Это вычисление использует обратную величину с одинарной точностью для 1/area
и затем умножает ту обратную величину на xaccum
и yaccum
найти центроидные координаты. Используя нативную обратную величину с плавающей точкой включает высокую точность и обеспечивает расширенный динамический диапазон. Когда вы генерируете HDL-код, кодер реализует обратную величину с помощью логики фиксированной точки вместо того, чтобы требовать ресурсов с плавающей точкой на FPGA. Для получения дополнительной информации смотрите Начало работы с Собственным компонентом HDL Coder Поддержка С плавающей точкой (HDL Coder).
bbox_store подсистема вычисляет ограничительную рамку. Подсистема вычисляет верхние левые координаты, ширину и высоту поля путем сравнения координат для каждой метки против ранее кэшируемых координат.
Во время шага маркировки каждый пиксель исследован с помощью только текущую линию и предыдущую линию значений метки. Это узкое особое внимание означает, что метки могут нуждаться в коррекции после того, как дальнейшие части блоба идентифицированы. Коррекция метки может быть проблемой и для основанных на системе координат и для передающих потоком пиксель реализаций. Схемы показывают два примера того, когда начальная маркировка требует коррекции.
Схема слева показывает текущий пиксель, соединяющий две области через предыдущую метку и верхнюю правую метку. Схема справа показывает текущий пиксель, соединяющий две области через предыдущую метку и главную метку. Текущий пиксель является первым местоположением, в котором алгоритм обнаруживает, что слияние требуется. Когда алгоритм обнаруживает слияние, тот пиксель отмечается для коррекции. В обеих схемах пиксели являются всей частью того же блоба и таким образом, каждый пиксель должен быть присвоен та же метка, 1
.
labelandmerge блок MATLAB function проверяет на слияния и возвращает uint32
значение, которое содержит две объединенных метки. Подсистема MergeQueue хранит любые слияния, которые происходят на текущей линии. В конце каждой линии cca подсистема читает значения MergeQueue и корректирует область, центроид и значения ограничительной рамки в аккумуляторах. Накопленные значения для двух объединенных меток добавлены вместе и присвоены одной метке. Вход к каждой подсистеме аккумулятора имеет 2:1 мультиплексор, который позволяет аккумулятору быть постепенно увеличенным или когда новая метка найдена, или когда слияние происходит.
В конце каждой системы координат модель обновляет два видеодисплея. Результаты На видеодисплее Изображений показывают входное изображение с ограничительными рамками (зеленые прямоугольники) и центроиды (красные кресты) наложенный. Маркировать видеодисплей Image показывает результаты этапа маркировки перед слиянием. В Маркировать отображении 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%)