Основной используемый функционал OpenCV – библиотека Aruco

Оценка положения в пространстве – важная задача для приложений компьютерного зрения. Данный процесс основан на вычислении положения объекта в реальном мире на основании его 2D проекции. Обычно этот шаг довольно не прост, поэтому распространённой практикой является использование синтетических опорных (англ.fiducial – “фидуциальных”) маркеров, для упрощения алгоритма.

Один из наиболее популярных подходов – использование квадратных бинарных опорных маркеров. Основное преимущество таких маркеров – один маркер содержит достаточно информации (положение четырёх его углов) для определения положения камеры. Также, внутренняя бинарная кодификация маркеров увеличивает надёжность их определения, позволяя применять алгоритмы поиска и коррекции ошибок.

Маркеры и словари

Aruco маркер – это квадрат, окаймлённый широкой чёрной границей, содержащий внутри бинарную квадратную матрицу, которая определяет его идентификатор (id). Черная граница обеспечивает его быстрый поиск на изображении, а бинарная кодификация – позволяет идентифицировать, с применение алгоритмов поиска и коррекции ошибок. Размер маркера определяет размер внутренней матрицы. Например, маркер размером 4ч4 содержит матрицу в 16 бит. Ниже приведены примеры изображений Aruco маркеров:

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

Словарь маркеров – это набор маркеров, используемый в определённом приложении. Это просто перечень идентификаторов маркеров в соответствии с их бинарной кодификацией. Основные параметры словаря – размер словаря и размер маркера. Размер словаря – это количество маркеров, которые включены в словарь. Размер маркера – количество бит в матрице маркера. Модуль Aruco включает несколько предопределённых словарей с различными размерами и количеством маркеров.

Id маркера не является прямым переводом бинарной кодификации маркера в число, это просто порядковый номер маркера в словаре, к которому он принадлежит.

Генерировать изображения маркеров можно с помощью функции OpenCV DrawMarker(словарь, id маркера, размер картинки, изображение, размер границы).

Поиска маркеров на изображении

Получив на входе изображение, содержащее Aruco маркеры, алгоритм поиска выдаёт перечень найденных маркеров. Каждый распознанный маркер характеризуется: положением его четырёх углов на картинке + id маркера. Процесс распознавания маркеров состоит из двух основных шагов:

  1. Определение маркер-кандидатов. На изображении осуществляется поиск всех квадратных форм, которые могут быть маркерами.

  2. После того как кандидаты определены – осуществляется анализ, являются ли они на самом деле маркерами, на основе их внутренней кодификации. Например, при поиске маркеров на следующем изображении:

Найдены следующие маркеры:

а следующие маркер-кандидаты были отклонены в ходе 2-го шага идентификации:

В aruco модуле поиск маркеров на изображении осуществляется с помощью функции detectMarkers(). Эта функция является самой важной в модуле, поскольку остальной функционал базируется на анализе маркеров, распознанных с помощью detectMarkers().

Определение положения в пространстве

После поиска маркеров на изображении – нам нужно определить положение камеры относительно маркеров.

Для того чтобы определить положение в пространстве – необходимо знать параметры калибровки Вашей камеры: матрицу камеры и коэффициенты искажения. Калиброка камеры может выполняться с помощью функции calibrateCamera() OpenCV, а также с помощью модуля aruco, пример будет рассмотрен ниже. Калибровка выполняется один раз, если оптические параметры камеры не меняются. В результате калибровки мы получаем матрицу камеры (3х3 элемента фокальных расстояний и координат центра камеры) и коэффициенты искажения: вектор из 5 или более элементов, моделирующих искажение изображения камерой. При определении положения Aruco маркеров в пространстве, положение каждого маркера может быть посчитано индивидуально. Также можно рассчитать одно положение относительно набора маркеров (т.н. Aruco Board). Положение камеры относительно маркера – это 3D-трансформация из координатной системы маркера в координатную систему камеры. Положение (англ. Pose) определяется векторами ротации (вращения) и трансляции (передвижения). В Aruco модуле есть функция для оценки положения всех найденных маркеров estimatePoseSingleMarkers:

estimatePoseSingleMarkers(corners, 0.05, cameraMatrix, distCoeffs, rvecs, tvecs)

corners – набор координат углов маркеров, которые вернула функция detectMarkers()

второй параметр (0.05) – размер маркера в метрах или любых других единицах измерения. Положение камеры оценивается в этих же единицах.

cameraMatrix, distCoeffs – параметры калибровки камеры, известные заранее rvecs, tvecs – векторы ротации и трансляции, соответственно, для каждого маркера в списке corners. Координатная система маркера, используемая этой функцией: с началом координат в центре маркера, ось Z указывает вверх от перпендикулярно изображению маркера, X – вправо от маркера, Y – вверх от маркера:

@page { size: 21cm 29.7cm; margin: 2cm } h4 { margin-bottom: 0.11cm; direction: ltr; line-height: 100%; text-align: left; orphans: 2; widows: 2; background: transparent; page-break-after: avoid } h4.western { font-size: 14pt; font-weight: bold } h4.cjk { font-family: "宋体"; font-size: 14pt; font-weight: bold } h4.ctl { font-family: "Times New Roman"; font-size: 14pt; font-weight: bold } p { margin-bottom: 0.25cm; direction: ltr; line-height: 115%; text-align: left; orphans: 2; widows: 2; background: transparent } a:visited { color: #954f72; text-decoration: underline } a:link { color: #0000ff; text-decoration: underline }

В aruco модуле есть функция рисования осей на изображении, чтоб проверить правильность определения положения:

drawAxis(image, cameraMatrix, distCoeffs, rvec, tvec, 0.1)

image – изображение, на котором рисовать оси (обычно то же изоражение, на котором осуществляется поиск маркеров)

cameraMatrix, distCoeffs – параметры калибровки камеры

rvec, tvec – параметры положения в пространстве, для которого рисовать оси

последний параметр (0.1) – длина осей, в тех же единицах, что и tvec (обычно, метры).

Выбор словаря

Модуль aruco предоставляет класс Dictionary для описания словаря маркеров. Кроме размера маркера и количества маркеров в словаре есть ещё один важный параметр словаря – дистанция между маркерами (inter-marker distance). Эта дистанция определяет возможности словаря для поиска и коррекции ошибок. В общес случае, меньшее количество маркеров в словаре и больший размер маркера увеличивают дистанцию между маркерами. Однако, поиск маркеров мольших размеров более сложен, в силу большего количества маски бит маркера для поиска на изображении. Например, если Вашему приложению нужно только 10 маркеров – лучше использовать словарь, состоящий из этих 10 маркеров, чем словарь из 1000 маркеров, т.к. в словаре из 10 маркеров дистанция между маркерами будет больше, что приведёт к более высокой устойчивости к ошибкам. В aruco модуле есть несколько способов определения словаря, с помощью которых можно увеличить надёжность системы:

  • Предопределённые словари – самый простой способ выбора словаря (функция getPredefinedDictionary);

  • Автоматическа генерация словаря (функция generateCustomDictionary);

  • Ручная генерация словаря (самый сложный способ, авторами не рассматривается).https://docs.opencv.org/3.4/d5/dae/tutorial_aruco_detection.html

Last updated