🔲 ArUco-навигация detect_aruco.py

Поиск ArUco-меток

aruco_examples/detect_aruco.py

Находит ArUco-метки словаря DICT_ARUCO_ORIGINAL и публикует поток aruco.

Создаётся детектор cv2.aruco.ArucoDetector. В цикле кадр проверяется на наличие меток, найденные метки обводятся drawDetectedMarkers и публикуются в поток aruco.

Как работает

  1. Создать словарь, параметры и детектор ArUco.
  2. Создать Camera() и ImageViewer().
  3. В цикле получать кадр.
  4. Искать метки aruco_detector.detectMarkers(frame).
  5. Рисовать метки и публиковать кадр в поток aruco.
  6. В finally остановить камеру и поток.

Используемые методы SDK

Ключевые параметры

ПараметрЗначениеОписание
dictionaryDICT_ARUCO_ORIGINALСловарь меток.
fps30Частота кадров.

Запуск

cd aruco_examples
python3 detect_aruco.py

Результат

  • Поток rtsp://10.42.0.1:8889/aruco/ с обведёнными метками.

Видеопотоки

rtsp://10.42.0.1:8889/aruco/

Примечания

  • Метки из папки aruco_markers соответствуют словарю DICT_ARUCO_ORIGINAL.

Требования

  • Драйвер камеры gstreamer.
  • ArUco-метка в поле зрения.

Полный исходный код

Показать detect_aruco.py
from pioneer_sdk2 import Camera, ImageViewer  # импортируем классы Camera и ImageViewer из библиотеки pioneer_sdk2
import cv2                                    # библиотека cv2 содержит функции для работы с изображениями

aruco_dict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_ARUCO_ORIGINAL) # выбираем словарь ArUco-меток
aruco_params = cv2.aruco.DetectorParameters()                         # создаем параметры для поиска ArUco-меток
aruco_detector = cv2.aruco.ArucoDetector(aruco_dict, aruco_params)    # создаем детектор ArUco-меток

camera = Camera()                             # создаем экземпляр класса Camera для получения кадров с камеры
viewer = ImageViewer()                        # создаем экземпляр класса ImageViewer для трансляции изображения

try:                                          # основной код находится внутри блока try
    while True:                               # запускаем бесконечный цикл
        frame = camera.get_cv_frame(timeout=1.0) # получаем один кадр с камеры
                                                 # timeout=1.0 - время ожидания кадра в секундах

        if frame is None:                     # проверяем, что кадр не был получен
            continue                          # пропускаем текущую итерацию цикла

        corners, ids, rejected = aruco_detector.detectMarkers(frame) # ищем ArUco-метки на изображении

        cv2.aruco.drawDetectedMarkers(frame, corners, ids) # рисуем найденные ArUco-метки на изображении

        viewer.imshow("aruco", frame, fps=30) # запускаем трансляцию изображения
                                              # aruco - название трансляции
                                              # frame - изображение с камеры
                                              # fps=30 - количество кадров в секунду

finally:                                      # блок finally выполнится при завершении программы
    camera.stop()                             # останавливаем получение кадров с камеры
    viewer.close()                            # останавливаем видеопоток