find_small_apriltags.py
# Эта работа лицензирована по лицензии MIT.
# Copyright (c) 2013-2023 OpenMV LLC. All rights reserved.
# https://github.com/openmv/openmv/blob/master/LICENSE
#
# Поиск маленьких меток Apriltags
#
# Этот скрипт показывает, как использовать отслеживание блобов в качестве предварительного фильтра для
# поиска меток Apriltags на изображении, используя отслеживание блобов для нахождения
# области, где сначала находится метка, а затем вызова find_apriltags
# для этого блоба.
# Обратите внимание: этот скрипт хорошо работает, если предполагается, что большая часть изображения не
# проходит проверку по порогу... в противном случае вы не получаете выигрыша
# в производительности.
# Пожалуйста, используйте семейство меток TAG36H11 для этого скрипта — это рекомендуемое семейство меток.
import csi
import time
# Задайте пороги для поиска белого объекта (т.е. границы метки)
thresholds = (150, 255)
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.GRAYSCALE)
csi0.snapshot(time=200) # увеличьте это значение, чтобы автоматические методы работали дольше
csi0.auto_gain(False) # должно быть отключено для отслеживания цвета
csi0.auto_whitebal(False) # должно быть отключено для отслеживания цвета
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
# Сначала мы находим блобы, которые могут быть кандидатами на метки.
box_list = []
# AprilTags может завершиться неудачей из-за нехватки оперативной памяти при заданном размере передаваемого изображения.
tag_list = []
for blob in img.find_blobs(
[thresholds], pixels_threshold=100, area_threshold=100, merge=True
):
# Затем мы ищем метку в области интереса (ROI), которая больше блоба.
w = min(max(int(blob.w * 1.2), 10), 160) # Не слишком маленькой, не слишком большой.
h = min(max(int(blob.h * 1.2), 10), 160) # Не слишком маленькой, не слишком большой.
x = min(max(int(blob.x + (blob.w / 4) - (w * 0.1)), 0), img.width() - 1)
y = min(max(int(blob.y + (blob.h / 4) - (h * 0.1)), 0), img.height() - 1)
box_list.append((x, y, w, h)) # Мы нарисуем их позже.
# Поскольку мы ограничиваем размер ROI, apriltags не должен исчерпать оперативную память.
# Но если это всё же произойдёт, мы это обработаем...
try:
tag_list.extend(img.find_apriltags(roi=(x, y, w, h)))
except (
MemoryError
): # Не перехватывайте все исключения, иначе вы не сможете остановить скрипт.
pass
for b in box_list:
img.draw_rectangle(b)
# Теперь выведем найденные метки
for tag in tag_list:
img.draw_detection(tag)
for c in tag.corners:
img.draw_circle((c[0], c[1], 5))
print("Tag:", tag.cx, tag.cy, tag.rotation, tag.id)