Комментарии 20
Очень интересно!
Есть ли простой способ определять скорость объектов?
Спасибо за комментарий!
Для различных задач могут использоваться разные методы. В общем случае, описанном в статье, при наличии неподвижной откалиброванной камеры, первым на ум приходит наиболее простой вариант: найти и замерить текущее время
на двух кадрах, а затем вычислить
(скорость равна расстоянию между координатами объекта на двух кадрах, делённому на прошедшее время между двумя кадрами; оно же
). Аналогично можно опираться не на
, а на
, например ограничив зону на изображении с заранее известным расстоянием в пространстве, как это делается на камерах контроля дорожного движения.
Однако данный метод рассчитывает не скорость в моменте, а среднюю скорость между кадрами, так что в некоторых прикладных задачах требуется расчёт ускорения, дополнительное предсказание движения/скорости объекта. Из-за этого же на результат может влиять количество кадров в секунду (FPS) и скорость обработки изображений.
Конкретно про ваш случай ответил в личных сообщениях.
Отличная статья! А проводились/планируются ли эксперименты по исследованию погрешности определения координат объекта? И на самом деле кроме погрешности ещё интересны отклонения/шумы при разном нахождении маркера относительно оптического центра камеры.
Спасибо за комментарий!
Точные замеры погрешности не проводились/планировались, хотя потенциально это не плохая тема для будущей статьи.
В рамках подготовки данной статьи было выявлено (см. результаты решения частных случаев), что при нахождении точки с заданной в среднем погрешность была ниже, чем нахождение той же точки в общем случае.
Также про оценку погрешности и в целом оптимальности различных решений задачи PnP существуют статьи:
A Consistently Fast and Globally Optimal Solution to the Perspective-n-Point Problem (2020) by G. Terzakis; M. Lourakis
Accurate non-iterative O(n) solution to the PnP problem (2007) by F. Moreno-Noguer; V. Lepetit; P. Fua
Однажды по не очень хорошим обстоятельствам познакомился с экспертами российского международного авиационного комитета (МАК - те самые, кто расследует авиационные катастрофы).
И они показывали презентацию про некоторые свои аспекты работы. Для расследования им необходимы параметры полета перед и в момент катастрофы (скорость, высота, направление, крен и тп). И в случаях с легко моторными или старыми самолетами, где нет черных ящиков у них проблемы с получением этих параметров.
В этих случаях они опираются на видеозаписи происшествий, если они конечно есть.
Первый случай, камера наблюдения в аэропорту записала проишествие. Эксперты с линейками измерили все ориентиры на земле, построили координатное пространство. Исправили "рыбий глаз" камеры, опираясь на габариты самолета, вычислили его параметры. Сказали, что это легко, хотя уже там математики было много.
Второй случай был сложнее, камера была в руках, и инцидент был записан с проводкой, т.е. оператор поворачивал камеру отслеживая самолет во время падения. Опять таки привязываясь к ориентирам на земле построили пространство, и в нем уже двигались модели самолета и модель камеры.
И третий случай, камера в руках, движется и снимает из самолета, через элюминатор. И вот только в этот момент, они прибегли к какой-то голливудской программе 3д рендеринга сцен...
Ну а так, статья конечно огонь!
Вам также может быть интересно,
Измерение расстояния до объекта и его скорости
Ссылки не работают аффинное преобразование, не ролики с ютуба. Тема интересная
В принципе можно восстановить объём сцены по дельте между кадрами, например, при движении монокуляра, в этом случае за счёт point flow +- можно оценить пространственное положение (при заданном поле зрения), плюс применение внешних гироскопа-акселерометра, позволяющих определить локальное перемещение. Насколько важно контрастное изображение для детектирования маркера а также образующего внешнего полигона, определяющего углы, например, в движении может быть эффект Rolling Shutter и смазывание, например, максимальная скорость детектирования при смещении объекта порядка десятков пикселей за один кадр.
Спасибо за комментарий!
Помимо гироскопа-акселерометра можно использовать кинематическую одометрию, например если камера установлена на мобильной платформе (роботе). И в целом существует множество методов "восстановления объёма" сцены по фотографиям передвигающейся камеры, в частности Visual SLAM (в различных реализациях)
Чтобы использовать метод критично знать параметры камеры, с помощью которой осуществлялась съёмка. На практике это проблема, если попытаться сделать решение для широкой аудитории.
Например, современные телефоны имеют несколько объективов с разными характеристиками и используют различные алгоритмы цифровой коррекции изображения. Калибровка по шаблонам даёт разные результаты в зависимости от освещённости, заляпанности отдельных объектов и даже версии софта на телефоне.
Если попытаться аналитически определить параметры, используя идентификаторы, доступные через драйверы и техническую документацию, то можно столкнуться с погрешностями из-за того, что многие производители используют различное аппаратное обеспечение в устройствах одной и той же маркетинговой линейки. При этом с точки зрения драйверов они выглядят одинаково.
Спасибо за комментарий!
Если всё же доступна калибровка по шаблонам, то используя OpenCV, добиться качественных результатов вполне реально. Можно выбрать конкретную камеру (объектив):
cap = cv2.VideoCapture(CAM_ID) # Создание объекта камеры
# CAM_ID - id/path конкретной камеры
Настроить различные её свойства (см. документацию OpenCV о VideoCapture Properties), вроде фокуса, зума, экспозиции и других:
cap.set(cv2.CAP_PROP_AUTOFOCUS, 0) # Отключение встроенной автофокусировки
cap.set(cv2.CAP_PROP_FOCUS, CAM_FOCUS) # Мануальная фокусировка
# CAM_FOCUS - уровень фокуса
# Например может быть установлен
# на значение, найденное
# методом автофокусировки
Некоторые свойства, которые непосредственно влияют на изображение:
cv2.CAP_PROP_AUTO_EXPOSURE
cv2.CAP_PROP_EXPOSURE
cv2.CAP_PROP_AUTO_WB
cv2.CAP_PROP_WB_TEMPERATURE
cv2.CAP_PROP_GAMMA
cv2.CAP_PROP_TEMPERATURE
cv2.CAP_PROP_ZOOM
Останется сохранить установленные свойства для дальнейшего использования и провести калибровку камеры, после чего решение задачи будет идентично описанному в статье. Поскольку свойства сохранены для дальнейшего использования, то (по идее) параметры камеры не должны меняться.
Также широкая аудитория встречается с данной задачей достаточно редко. Как мне кажется, из задач близких к описываемой, чаще всего широкая аудитория встречается с дополненной реальностью (AR), для которой хоть и может использоваться OpenCV, но всё же имеется свой стек и свои технологии.
А узкая (специализированная) аудитория обычно имеет возможность использовать камеры без проблем с калибровкой.
Так или иначе хорошее примечание, спасибо!
Также широкая аудитория встречается с данной задачей достаточно редко
Навскидку: линейка-дальномер как приложение для камеры, управление жестами с позиционированием в 3d, биометрия (где нужно понимать расстояние до отдельных точек на голове), спидометр для определения скорости объекта в камере. Про OpenCV все в курсе, попыток использовать много, - в сторах полно игрушек, - но для практического применения точность оставляет желать лучшего.
Настроить различные её свойства (см. документацию
Документация описывает возможности, да. Но в реальности не все параметры и настройки есть в драйверах конкретных устройств, а если и есть, то работают одинаково и как ожидается во всех версиях. Я про массовый рынок сейчас.
Ниша действительно в специализированных аппаратно-программных комплексах, где у вас есть полный контроль и понимание как работает и софт, и оборудование, в каких диапазонах меняются характеристики среды, и какова допустимая погрешность измерений.
Для ускорения скорее всего придётся использовать Multiprocessing чтобы раскидать кадр(ы) по отдельным потокам, включая то что крутится на GPU, в основном используется блок shared memory, или отдельные потоки для пост-обработки объектов в цикле, но там можно столкнуться с производительностью Queue ввиду сериализации и задействованию GIL на определённых моментах, вроде как в 13-й версии Питона этот вопрос поставлен на повестку.
Как зависит предельная точность определения координат объекта от параметров камеры (разрешение, фокусное расстояние и т.п.)
По-хорошему, нужно выдавать интервал, а не число. Ну или если понятен потребитель, то нечёткое число (вектор).
Правильно ли я понимаю, что для приведённого геометрического подхода лучше всего использовать длиннофокусные камеры с большой ГРИП?
Определение положения объектов на изображении: как найти пространственные координаты объекта, используя OpenCV