Геометрия камеры: Алгоритм «коррекции области объекта»

Проект, над которым я работал последние несколько месяцев, заключается в вычислении верхней области объекта, снятого с помощью 3D-камеры глубины с видом сверху.

рабочий процесс моего проекта:

  1. захватить группу изображений объектов (данные RGB, DEPTH) из вида сверху

  2. Сегментация экземпляра с изображением RGB

  3. Рассчитать реальную площадь сегментированной маски с данными DEPTH

Некоторая проблема в проекте:

  • Все заданные предметы имеют разную форму
  • Боковая сторона объекта, а не его верхняя часть, начинает видна по мере того, как он перемещается за пределы изображения.
  • Из-за этого сегментируемая область маски постепенно увеличивается.
  • В результате фактическая площадь объекта, находящегося за пределами изображения, вычисляется больше, чем у объекта, расположенного в центре.

На изображении-примере объект 1 расположен в середине ракурса, поэтому видна только вершина объекта, а объект 2 расположен вне ракурса, поэтому часть вершины теряется и видна сторона.

Из-за этого сегментируемая область маски больше для объектов, расположенных на периферии, чем для объектов, расположенных в центре.

Я только хочу найти площадь вершины объекта.

пример того, что я хочу изображение:

Геометрия камеры: Алгоритм «коррекции области объекта»

Есть ли способ геометрически скорректировать площадь объекта, находящегося за пределами изображения?

Я попытался откалибровать, умножив площадь, рассчитанную в соответствии с углом, образованным Вектором 1, соединяющим центральную точку объектива камеры с центральной точкой пола, и Вектором 2, соединяющим центральную точку объектива с центром тяжести цели. объекта по определенному значению. Однако я сдался, потому что не мог логически объяснить, насколько необходима коррекция.

рис. 3:

Мы называем такие «объекты» животными.

Yves Daoust 26.01.2023 14:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
78
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Что бы я сделал, так это преобразовал ваше изображение RGB и глубины в 3D-сетку (поверхность с выпуклостями), используя настройки вашей камеры (FOV, фокусное расстояние) примерно так:

а затем спроецируйте его на плоскость земли (перпендикулярно направлению обзора камеры в середине экрана). Чтобы получить плоскость земли, просто возьмите 3 трехмерных положения земли p0,p1,p2 (формируя треугольник) и используя векторное произведение для вычисления нормали к земле:

n = normalize(cross(p1-p0,p2-p1))

теперь ваша плоскость определяется p0,n, поэтому просто каждая 3D-координата преобразуется следующим образом:

просто добавив вектор нормали (к земле), умноженный на расстояние до земли, если я правильно понимаю, что-то вроде этого:

p' = p + n * dot(p-p0,n)

Это должно устранить проблему с видимыми сторонами на краях FOV, однако вы также должны принять во внимание, что при отображении стороны некоторая часть верха также скрыта, чтобы исправить, что вы также можете найти ось симметрии и использовать только половину верхней стороны ( что не скрыто частично) и просто умножить измеренную половину площади на 2...

Прежде всего большое спасибо за ваши приятные комментарии. Тем не менее, у меня есть вопрос из ваших комментариев. Я получил изображение после установки камеры в направлении обзора сверху (совершенно перпендикулярно земле) на потолке на высоте 2800 мм от земли. Итак, правильно ли, что плоскость, представляющая землю, имеет просто z = 2800? Если это так, то если я проецирую курицу на воображаемую плоскость z=2500, параллельную земле, как на рис. 3, который я только что добавил к тексту, я ожидаю, что сторона будет спроецирована на плоскость такой, какая она есть. Как вы определяете плоскость, которая представляет собой землю?

윤도현 27.01.2023 03:51

@윤도현 Вы берете 3 трехмерных положения земли p0,p1,p2 (образуя треугольник) и используете перекрестное произведение для вычисления нормали n = normalize(cross(p1-p0,p2-p1)), теперь ваша плоскость определяется p0,n

Spektre 27.01.2023 09:27

Поскольку у цыплят нет плоской вершины, камера может не увидеть «дальний угол». Например, этот метод не работает со сферическими цыплятами.

Matt Timmermans 27.01.2023 14:44

@Spektre Как вы сказали, после создания 3D-сетки и проецирования ее на z = 0 (земля) была получена желаемая форма. Большое спасибо!!

윤도현 29.01.2023 08:35

Точное вычисление практически безнадежно, потому что вы не видите всех сторон.

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

Но так как часть поверхности скрыта, вам, возможно, придется реконструировать ее, используя симметрию.

Ваши комментарии тоже очень помогли. Большое спасибо!

윤도현 30.01.2023 12:41

Невозможно сделать это точно для произвольных объектов, поскольку могут быть части объекта, которые вносят вклад в «верхнюю область», но которые камера не может видеть. Поскольку камера не может видеть эти части, вы не можете сказать, насколько они велики.

Поскольку все ваши объекты, как известно, являются цыплятами, вы можете получить довольно точную оценку следующим образом:

  1. Используйте анализ основных компонентов, чтобы определить ориентацию каждого цыпленка.
  2. Используя много объектов на многих изображениях, найдите наиболее подходящий полином, который оценивает видимый размер цыпленка по расстоянию от центра изображения и ориентации относительно вектора расстояния.
  3. Таким образом, для любой заданной курицы вы можете разделить ее видимый размер на оценочный средний видимый размер для ее расстояния и ориентации, чтобы получить нормализованное измерение размера курицы.

Ваши комментарии тоже очень помогли. Большое спасибо!

윤도현 29.01.2023 08:37

Другие вопросы по теме