Расчет центральной точки для локализации робота в 3D-данных

Я пытаюсь найти надежный метод вычисления угловых точек контейнера. Из этих угловых точек идея состоит в том, чтобы вычислить центральную точку контейнера для локализации робота, это означает, что вычисленная центральная точка будет пунктом назначения робота, чтобы забрать контейнер. Для этого я ищу любые предложения по вычислению угловых точек или, возможно, есть возможность напрямую вычислить центральную точку. До этого момента для обработки 3D-данных использовалась библиотека PCL C/C++. На изображении ниже показан скриншот контейнера.
Заранее спасибо.

после применения сквозного доступа


person 2017_John    schedule 22.02.2017    source источник
comment
вы пытаетесь найти центр этого прямоугольника?   -  person Sneaky Polar Bear    schedule 22.02.2017
comment
на самом деле я не думал, что нахождение центра прямоугольника также может каким-то образом решить проблему. Это означает, что если мой подход состоит в том, чтобы найти углы и вычислить центр, у которого, конечно, есть несколько шагов. Как вы упомянули, поиск центра может быть лучшим решением. Нахождение центра и добавление смещения. Вы предлагаете какие-либо возможности для расчета непосредственно в PCL?   -  person 2017_John    schedule 23.02.2017
comment
У вас есть данные о глубине? Я не вижу никаких внутренних поверхностей этого контейнера... (я понимаю, что это 3D-данные, но может ли ваш датчик разрешать только переднюю поверхность тележки?)   -  person Sneaky Polar Bear    schedule 23.02.2017
comment
Если вы видите второе изображение (только что загруженное) с лучшей видимостью контейнера сзади. Я думаю, здесь он ориентирован таким образом, что передняя часть выровнена с данными задней части.   -  person 2017_John    schedule 23.02.2017
comment
Есть ли шанс, что вы могли бы опубликовать irl фотографию объекта, на который вы смотрите?   -  person Sneaky Polar Bear    schedule 23.02.2017
comment
Конечно! ирл картинка?   -  person 2017_John    schedule 23.02.2017
comment
например, фото с телефона или что-то в этом роде. Просто трудно получить представление о 3D-данных с помощью 2D-снимка облака точек, поэтому, чтобы помочь, может помочь обычное изображение камеры или каким-либо образом публикация файла облака точек (.pcd).   -  person Sneaky Polar Bear    schedule 23.02.2017
comment
Эти недавно загруженные изображения дают некоторое представление о 3D-виде. Я также могу загрузить (.pcd).   -  person 2017_John    schedule 28.02.2017
comment
Имао, я имел в виду реальный объект, такой как jpg с вашего телефона объекта, ха-ха, а не ваш экран, показывающий облако точек. Да, pcd будет работать, тогда я могу просто загрузить его в свою систему и посмотреть.   -  person Sneaky Polar Bear    schedule 28.02.2017
comment
В порядке. Я неправильно понял. извините за это :) Вот файл pcd. и выше изображение с реальным объектом. s000.tinyupload.com/index.php?file_id=55077453674107310625   -  person 2017_John    schedule 01.03.2017
comment
Извините, я никогда не видел, чтобы вы разместили эту фотографию. Это именно то, что я хотел.   -  person Sneaky Polar Bear    schedule 08.03.2017


Ответы (2)


Я предполагаю, что колеса удерживают тележку на известном смещении от пола, и вы можете определить пол. Отфильтруйте все точки, которые находятся слишком близко к полу (это удалит колеса и все, кроме тележки, что поможет ограничить данные и упростить дальнейшие шаги.

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

Если вы не можете изолировать корзину или другие методы не работают, попробуйте использовать пример PCL. консенсус, в частности SACMODEL_LINE. Это будет запутанная стратегия, но она даст очень надежные результаты, в основном пробежав и найдя каждую строку и вычтя ее элементы из облака, чтобы найти следующую лучшую строку. После того, как у вас есть 4 основные линии корзины, используйте их параметры, чтобы найти свой центроид. * это также будет устойчивым к случайным предметам, находящимся в тележке или на ней, а также к тележкам разных размеров (при условии, что они всегда имеют линейные перпендикулярные стены)

person Sneaky Polar Bear    schedule 23.02.2017
comment
Отличные предложения. спасибо. Что вы говорите относительно (1) определения пола и (2) фильтрации точек, которые находятся слишком близко к полу, чтобы удалить колеса и оставить только тележку, чтобы впоследствии я мог использовать (3) ограничивающую рамку. ? - person 2017_John; 28.02.2017
comment
Это довольно четкие объяснения... что касается того, как это реализовать на самом деле, слишком много нужно объяснять. Он очень хорошо документирован с учебными пособиями и веб-документацией по классам. Вот хорошее место для начала: pointclouds.org/documentation/tutorials. они сначала есть, а потом их модифицируют под свои нужды. - person Sneaky Polar Bear; 28.02.2017
comment
на самом деле я просматривал учебные пособия по PCL и использовал RANSAC для подгонки плоскости и т. д. Не могли бы вы упомянуть какой-либо конкретный пример, в котором возможно обнаружение и удаление плоскости, каким-то образом было бы легче отфильтровать колесо после и найти прямоугольную призму, ограничивающую коробка на объекте тележки? - person 2017_John; 01.03.2017
comment
comment
Пробовал с разными порогами дистанции. Передняя поверхность контейнера выполнена плоскостью, а не точками пола, если есть пожелания. *.pcd файл находится в новой ссылке ниже. pcl::SACSegmentation‹pcl::PointXYZ› seg; seg.setOptimizeCoefficients (истина); seg.setModelType (pcl::SACMODEL_PLANE); seg.setMethodType (pcl::SAC_RANSAC); seg.setDistanceThreshold (20.02); seg.setInputCloud (облако); seg.segment (*вставки, *коэффициенты); - person 2017_John; 01.03.2017
comment
Да, и обнаруженная плоскость всегда является передней поверхностью контейнера, поскольку это только плоскость с большим количеством точек. Поскольку моей основной целью является получение центральной точки/центроида 3D-объекта/контейнера, если вы посмотрите на недавно опубликованный файл *.pcd(afterApplyingPassthrough), где я использовал только сквозной фильтр, чтобы отбросить точки пола и колеса, предполагая, что смещение от пола всегда известно. - person 2017_John; 08.03.2017
comment
После применения сквозной передачи, как показано в *.pcd выше. Я попытался вычислить центроид оставшегося объекта (без точек пола и колес) 1) pcl::compute3DCentroid(*cloudExtracted, centroid) 2) как вы упомянули, другая идея состоит в том, чтобы найти ограничивающую рамку для оставшегося объекта. что вы говорите, какой из них подходит лучше в этом случае. - person 2017_John; 08.03.2017
comment
Я думаю, что вычисление центроида даст вам более надежную точку зрения. Возможно, вам придется установить статическое смещение для этой точки (из-за этих маленьких клапанов наверху, которые немного подтянут ее). - person Sneaky Polar Bear; 08.03.2017

Я сделал следующие вещи:

  • Я бинаризировал изображение (черные пиксели = 0, зеленые пиксели = 1),
  • инвертировал изображение (черные пиксели = 1, зеленые пиксели = 0),
  • размыл изображение с ядром 3x3 N раз и расширил его с тем же ядром M раз.

Слева: N=2, М=1; Справа: N=6, М=6

введите здесь описание изображения введите здесь описание изображения

После этого:

  • Я вычислил контуры всех ненулевых областей и
  • удален контур, который окружал все изображение.

Вот такие контуры остались:

введите здесь описание изображения введите здесь описание изображения

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

  • вычислить повернутый прямоугольник, который лучше всего соответствует вашему контуру (вам нужно что-то похожее на minAreaRect из OpenCV)
  • вычислить площади прямоугольника и внутренней части контура
  • если разница между площадью контура и площадью повернутого ограничивающего прямоугольника мала, контур имеет приблизительно прямоугольную форму
  • найти контур, который одновременно является прямоугольным и удовлетворяет какому-либо другому условию (например, типичной площади контейнера). Предположим, что это принадлежит контейнеру, и вычислите его центр.

Я не утверждаю, что это решение будет хорошо работать в реальных сценариях. Это тоже не быстро. Вы должны рассматривать его как «набросок», показывающий, как извлечь некоторую полезную информацию.

person Nejc    schedule 23.02.2017
comment
Изображение, которое я разместил выше, является скриншотом данных облака точек. Это буквально означает, что обработка должна быть не на этом изображении, а на данных глубины. но спасибо, это кажется хорошим, если это 2D-изображение. не так ли? - person 2017_John; 23.02.2017