Проект, над которым я работал последние несколько месяцев, заключается в вычислении верхней области объекта, снятого с помощью 3D-камеры глубины с видом сверху.
рабочий процесс моего проекта:
захватить группу изображений объектов (данные RGB, DEPTH) из вида сверху
Сегментация экземпляра с изображением RGB
Рассчитать реальную площадь сегментированной маски с данными DEPTH
Некоторая проблема в проекте:
На изображении-примере объект 1 расположен в середине ракурса, поэтому видна только вершина объекта, а объект 2 расположен вне ракурса, поэтому часть вершины теряется и видна сторона.
Из-за этого сегментируемая область маски больше для объектов, расположенных на периферии, чем для объектов, расположенных в центре.
Я только хочу найти площадь вершины объекта.
пример того, что я хочу изображение:

Есть ли способ геометрически скорректировать площадь объекта, находящегося за пределами изображения?
Я попытался откалибровать, умножив площадь, рассчитанную в соответствии с углом, образованным Вектором 1, соединяющим центральную точку объектива камеры с центральной точкой пола, и Вектором 2, соединяющим центральную точку объектива с центром тяжести цели. объекта по определенному значению. Однако я сдался, потому что не мог логически объяснить, насколько необходима коррекция.
рис. 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, который я только что добавил к тексту, я ожидаю, что сторона будет спроецирована на плоскость такой, какая она есть. Как вы определяете плоскость, которая представляет собой землю?
@윤도현 Вы берете 3 трехмерных положения земли p0,p1,p2 (образуя треугольник) и используете перекрестное произведение для вычисления нормали n = normalize(cross(p1-p0,p2-p1)), теперь ваша плоскость определяется p0,n
Поскольку у цыплят нет плоской вершины, камера может не увидеть «дальний угол». Например, этот метод не работает со сферическими цыплятами.
@Spektre Как вы сказали, после создания 3D-сетки и проецирования ее на z = 0 (земля) была получена желаемая форма. Большое спасибо!!
Точное вычисление практически безнадежно, потому что вы не видите всех сторон.
Предполагая, что ваша информация о глубине доступна в виде изображения диапазона, вы можете рассмотреть точки внутри маски сегментации одного цыпленка, оценить вертикальное направление в этой точке, повернуть и спроецировать точки, чтобы получить силуэт.
Но так как часть поверхности скрыта, вам, возможно, придется реконструировать ее, используя симметрию.
Ваши комментарии тоже очень помогли. Большое спасибо!
Невозможно сделать это точно для произвольных объектов, поскольку могут быть части объекта, которые вносят вклад в «верхнюю область», но которые камера не может видеть. Поскольку камера не может видеть эти части, вы не можете сказать, насколько они велики.
Поскольку все ваши объекты, как известно, являются цыплятами, вы можете получить довольно точную оценку следующим образом:
Ваши комментарии тоже очень помогли. Большое спасибо!
Мы называем такие «объекты» животными.