Найдите цветные блоки
Видеоурок 4. Распознавание цветов: https://singtown.com/learn/49993/
функция find_blobs
Отслеживание мяча — наиболее часто используемая функция OpenMV. Ее можно найти в разделе Начните быстро за 10 минут.\ Цветные блоки можно найти с помощью функции find_blobs. Давайте обсудим детали find_blobs.
image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, area_threshold=10, pixels_threshold=10, merge=False, margin=0, threshold_cb=None, merge_cb=None)
Здесь много параметров.
- Пороги — это цветовой порог. Примечание. Этот параметр представляет собой список и может содержать несколько цветов. Если вам нужен только один цвет, вам понадобится только одно значение цвета в этом списке. Если вам нужны несколько цветовых порогов, тогда в этом списке потребуется несколько цветовых порогов. Примечание. Вы можете вызвать метод кода для возвращенного объекта цветового блока, чтобы определить, какого цвета этот цветовой блок.
red = (xxx,xxx,xxx,xxx,xxx,xxx)
blue = (xxx,xxx,xxx,xxx,xxx,xxx)
yellow = (xxx,xxx,xxx,xxx,xxx,xxx)
img=sensor.snapshot()
red_blobs = img.find_blobs([red])
color_blobs = img.find_blobs([red,blue, yellow])
roi — «область интереса». Он был представлен в разделе Статистика использования.
left_roi = [0,0,160,240]\ blobs = img.find_blobs([red],roi=left_roi)
x_stride — это пиксель с наименьшей шириной в направлении x искомого цветового блока. Значение по умолчанию — 2. Если вы хотите найти только цветные блоки шириной более 10 пикселей, установите для этого параметра значение 10:
blobs = img.find_blobs([red],x_stride=10)
y_stride — это пиксель с минимальной шириной в направлении y искомого цветового блока. Значение по умолчанию — 1. Если вы хотите найти только цветные блоки шириной более 5 пикселей, установите для этого параметра значение 5:
blobs = img.find_blobs([red],y_stride=5)
invert меняет пороговое значение и ищет цвета, отличные от порогового, в качестве порогового.
area_threshold порог области, если обрамленная область цветового блока меньше этого значения, она будет отфильтрована
Pixels_threshold Порог количества пикселей. Если количество пикселей в цветовом патче меньше этого значения, оно будет отфильтровано
merge Merge, если установлено значение True, затем объединяет все перекрывающиеся объекты в один.\ ПРИМЕЧАНИЕ. Это объединит все капли, независимо от их цвета. Если вы хотите спутать капли разных цветов, просто вызовите find_blobs с разными цветовыми порогами отдельно.
all_blobs = img.find_blobs([red,blue,yellow],merge=True)
red_blobs = img.find_blobs([red],merge=True)
blue_blobs = img.find_blobs([blue],merge=True)
yellow_blobs = img.find_blobs([yellow],merge=True)
- граница поля, если установлено значение 1, два больших объекта также будут объединены, если они находятся на расстоянии одного пикселя друг от друга.
порог
Структура цветового порога такая:
red = (minL, maxL, minA, maxA, minB, maxB)
Значения в кортеже — это максимальное и минимальное значения L A B соответственно.
Если вы хотите получить этот порог в образе IDE, см.: [Быстрое начало работы за 10 минут] (/quick-starter.md)
В новой версии IDE появился более удобный инструмент выбора порогов, см. ниже.
Инструмент выбора цветового порога
В OpenMV IDE добавлен инструмент выбора порогов, который значительно облегчает отладку цветовых порогов.
Сначала запустите hello world.py, чтобы фреймбуфер в IDE отобразил шаблон.\ \ Затем откройте Инструменты → Mechine Vision → Редактор порогов.\
Нажмите «Буфер кадра», чтобы получить изображение в IDE, и «Файл изображения», чтобы выбрать файл изображения самостоятельно.
Перетащите шесть ползунков, чтобы увидеть результаты пороговых значений в реальном времени. Мы хотим, чтобы наш целевой цвет стал белым, а все остальные цвета — черными.
blobs - это список
Объект find_blobs возвращает список из нескольких больших двоичных объектов. (Обратите внимание на различие между каплями и каплями. Это всего лишь название, используемое для отличия нескольких цветовых блоков от одного цветового блока).\ Список аналогичен массиву в языке C. Список больших двоичных объектов содержит множество объектов больших двоичных объектов. Каждый объект больших двоичных объектов содержит информацию о цветовом блоке.
blobs = img.find_blobs([red])
Blobs – это множество цветных блоков.
Вы можете использовать цикл for для поиска всех цветовых блоков.
for blob in blobs:
print(blob.cx())
Информацию об использовании циклов for см. в разделе основные знания Python
Объект цветового блока blob
У Blob есть несколько методов:
blob.rect() возвращает внешнюю рамку этого цветового блока — прямоугольный кортеж (x, y, w, h), который можно использовать непосредственно в image.draw_rectangle.
blob.x() возвращает координату x (int) внешней рамки цветового блока, которую также можно получить через blob[0].
blob.y() возвращает координату y (int) внешней рамки цветового блока, которую также можно получить с помощью blob[1].
blob.w() возвращает ширину w (int) внешней рамки цветового блока, которую также можно получить с помощью blob[2].
blob.h() возвращает высоту h (int) внешней рамки цветового блока, которую также можно получить с помощью blob[3].
blob.pixels() возвращает количество пикселей цветового блока (int), которое также можно получить через blob[4].
blob.cx() возвращает координату центра x (int) внешней рамки цветового блока, которую также можно получить с помощью blob[5].
blob.cy() возвращает центральную координату y (int) внешней рамки цветового блока, которую также можно получить с помощью blob[6].
blob.rotation() возвращает угол поворота цветового блока в радианах (с плавающей запятой). Если цветовой блок напоминает карандаш, то это значение будет составлять 0~180°. Если цветовое пятно представляет собой круг, то это значение бесполезно. Если цветовой блок вообще не имеет симметрии, то вы получите 0~360°, что также можно получить с помощью blob[7].
blob.code() возвращает 16-битное число, каждый бит соответствует каждому порогу. Например:
blobs = img.find_blobs([красный, синий, желтый], merge=True)
Если цветовой блок красный, его код — 0001, а если синий — его код 0010. Примечание. Большой двоичный объект можно объединить. Если это красный и синий большой двоичный объект, то это большой двоичный объект — 0011. Эту функцию можно использовать для поиска цветовых кодов. Его также можно получить через blob[8].
blob.count() Если merge=True, несколько больших двоичных объектов будут объединены в один большой двоичный объект, и эта функция возвращает это число. Если merge=False, возвращаемое значение всегда равно 1. Его также можно получить через blob[9].
blob.area() возвращает площадь внешнего поля цветового блока. Должно быть равно (w * h)
blob.density() возвращает плотность цветного пятна. Это равно количеству пикселей в патче, делённому на площадь ограничивающего прямоугольника. Если плотность низкая, то цель захватывается не очень хорошо.\ Например, чтобы идентифицировать красный круг, возвращаемый blob.pixels() — это количество пикселей целевого круга, а blob.area() — это площадь описанного квадрата круга.