Найдите цветные блоки

Видеоурок 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() — это площадь описанного квадрата круга.

results matching ""

    No results matching ""