В этой статье мы рассмотрим определение и оценку ориентации маркеров ArUco с помощью Python и OpenCV.

Во-первых, мы начнем с создания маркеров ArUco. Вы можете использовать определенный веб-сайт для создания отдельных тегов один за другим или использовать мою программу для создания целых страниц маркеров.

Как только вы создадите несколько маркеров, я покажу вам другую программу для их обнаружения. Эта программа также может определять оси положения этих маркеров ArUco.

Код, который я написал здесь, написан на Python, но для более продвинутых приложений обнаружения и оценки позы вы можете обратиться к C++ для их реализации.

То, что вы найдете ниже, является результатом моего любопытства и желания поэкспериментировать с обработкой изображений. Любые конструктивные комментарии приветствуются.

Создание маркеров ArUco

Если вы хотите создавать маркеры ArUco один за другим, то вы можете использовать этот сайт Олега Калачева. Этот веб-сайт предлагает простой интерфейс, как вы можете видеть ниже:

Выберите словарь ArUco, идентификатор маркера и размер. Затем скачайте маркер и распечатайте его.

Я хотел печатать целые страницы маркерами ArUco, поэтому этот сайт мне не помог.

Теперь OpenCV предлагает две функции, называемые cv.aruco.GridBoard.create() и cv.aruco.GridBoard.draw(), как раз для этого — создания и последующего рисования целой страницы маркеров ArUco. Подробнее об этих функциях можно прочитать здесь.

Тем не менее, я был недоволен результатом, когда опробовал функции. Размер маркеров ArUco был неверным при печати, некоторые маркеры были неправильно размещены в границах страницы, и нет возможности добавить идентификаторы маркеров.

Поэтому я решил написать свою программу для генерации страниц маркеров ArUco. Вы можете найти его ниже:

Идея этой программы заключается в создании страницы формата A4 с маркерами ArUco (или апрельскими тегами), размещенными на сетке. Несколько входных параметров определяют размер этой сетки:

  • Размер маркера/бирки в мм
  • Размер полей между маркерами в мм
  • Количество тегов в направлении X
  • Количество тегов в направлении Y
  • Если id тега должен быть написан над тегом или нет

Программа определит, будут ли предоставленные параметры создавать сетку, которая будет оставаться в пределах страницы A4. Программа выдаст сообщение об ошибке, если это не так.

В дополнение к указанным выше параметрам вы также можете указать следующие другие параметры:

  • Имя выходного файла изображения
  • Идентификатор первого тега, который будет размещен на странице.
  • DPI выходного изображения
  • Тип маркера или тега для создания

Вот несколько примеров того, как создать страницу с маркерами:

python aruco_gen_page.py -o "aruco_markers.png" -i 0 -t "DICT_5X5_50" -d 72 --write-id -x 3 -y 4

Это создаст следующую страницу:

python aruco_gen_page.py -o "aruco_markers.png" -i 10 -t "DICT_4X4_50" -d 72 -s 25 -m 10 --no-write-id -x 5 -y7

Это дает следующий результат:

Чтобы убедиться, что сгенерированные изображения печатаются правильно при работе с Windows 11, наилучший подход к печати следующий:

Перейдите в папку, в которую были выведены изображения с маркерами. Затем щелкните значок правой кнопкой мыши и выберите «Печать». Вам будет представлен следующий диалог (вероятно, не частично на голландском языке, как у меня):

Здесь выберите свой принтер, установите бумагу на A4 и выберите «Стандартное» качество и «Обычную» бумагу (хотя я подозреваю, что эти настройки могут отличаться от принтера к принтеру). Убедитесь, что выбрано «Фото на всю страницу» и установлен флажок «По размеру изображения в рамке».

Я не тестировал эту программу с другими операционными системами.

Обнаружение и оценка положения наших маркеров ArUco

Прежде чем мы сможем обнаружить и оценить положение маркеров, нам нужно откалибровать нашу камеру. Как это сделать, смотрите в моей статье ниже.



Когда вы откалибровали камеру, вам нужно получить матрицу камеры и коэффициенты искажения. Я поместил их в файл JSON, как показано в статье.

Ниже приведена программа, которую я использовал для обнаружения и оценки.

Сначала загрузите матрицу камеры и коэффициенты искажения из файла JSON.

Далее считываем кадр с камеры, чтобы определить ширину и высоту изображений в видеопотоке.

Затем используйте функции OpenCV cv2.getOptimatlNewCameraMatrix() и cv2.unitUndistortRectifyMap() для определения области интереса roi и параметров mapx и mapy.

Внутри бесконечного цикла мы читаем кадр из видеопотока. Этот кадр переназначается (не искажается) с использованием параметров mapx и mapy, которые мы только что нашли. Кроме того, изображение обрезается только до интересующей области.

Теперь мы можем начать обнаруживать маркеры с помощью функции OpenCV cv2.aruco.detectMarkers(). Я также включил возможность использования версии текущего кадра изображения в градациях серого.

Затем, если какие-то маркеры были обнаружены (отмечены их углами), мы можем нарисовать прямоугольник вокруг маркеров в видеокадре с помощью функции cv2.aruco.drawDetectedMarkers(), включая id. При желании мы также можем нарисовать оси, показывающие положение каждого из маркеров в кадре, используя cv2.estimatePoseSingleMarkers() и cv2.aruco.drawFrameAxes(). Подробнее об этих функциях читайте здесь и здесь.

Наконец, используя cv2.imshow(), мы показываем кадр в графическом интерфейсе на экране.

Ниже приведены два скриншота из GUI, показывающие, что программа правильно определяет оси позы и идентификатор каждого маркера на страницах, которые мы создали ранее.

Большинство или все маркеры обнаруживаются, когда я держу страницы относительно неподвижно или даже с небольшим движением. С другой стороны, если я буду быстрее перемещать страницы мимо камеры, то в какой-то момент маркер не будет обнаружен. Я предполагаю, что реализация Python, которую мы сделали, работает недостаточно быстро, чтобы иметь возможность «следовать».

Если это правильно, и если нам нужно обнаружить маркеры ArUco для использования, например, автономным транспортным средством, то реализация должна быть сделана на C++, чтобы работать достаточно быстро.

Рекомендации

'Создание маркеров ArUco с помощью OpenCV и Python' от Pyimagesearch

'Обнаружение маркеров ArUco с помощью OpenCV и Python' от Pyimagesearch

'Оценка позы в 3D с использованием тега aruco в python' by Programming.vip

Примеры Python cv2.initUndistorRectifyMap() на сайте programcreek.com»