Преобразование 3D-изображения в 2D-изображение PointCloud в OpenCV — C++

Я собираю 3D-изображение руки с моего Kinect и хочу создать 2D-изображение, используя только значения X и Y для обработки изображения с помощью OpenCV. Размер 3D-матрицы является переменным и зависит от выходных данных Kinect, а значения X и Y не соответствуют масштабу для создания 2D-изображения. Мои 3D-точки и мое 3D-изображение: http://postimg.org/image/g0hm3y06n/

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

Я действительно не знаю, как я могу создать свое 2D-изображение для выполнения обработки изображения.

Кто-то может мне помочь или привести хороший пример, который я могу использовать для создания своего изображения и правильного масштабирования для этой проблемы? Я хочу в качестве вывода КОНТУРЫ РУК.


person lfelipesv    schedule 05.02.2014    source источник


Ответы (3)


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

person Andrey Smorodov    schedule 05.02.2014
comment
Привет Андрей, спасибо за ответ. Контуры, которые я найду, будут точками 3d? На самом деле, более простой подход, который я хочу, - это создать изображение Mat, jpg или другое изображение, которое я могу выполнять с помощью OpenCV для распознавания жестов. Вы знаете, как я могу сделать это преобразование? - person lfelipesv; 05.02.2014
comment
Вы можете получить бинарное изображение, используя операторы морфологии. Вы можете применить cv::dilate с размером ядра немного большим, чем среднее расстояние между точками на изображении. Так точки станут крупнее, и вы получите цельный силуэт руки. Затем вы можете применить эрозию, чтобы уменьшить силуэт до исходного размера. Эта операция называется закрытием en.wikipedia.org/wiki/Closing_(morphology). - person Andrey Smorodov; 05.02.2014
comment
Привет, Андрей, у меня это сработает, но у меня есть основная проблема, потому что для эрозии и дилатации мне нужно создать изображение, которое я могу прочитать с помощью OpenCV imread. Теперь у меня есть только PCD (файл облака точек), я уже сделал проекцию, поэтому только мои компоненты X и Y отличаются от 0. Знаете ли вы, как я могу получить свой файл PCD и создать файл, который я могу прочитать с помощью imread ? Благодарю вас! - person lfelipesv; 05.02.2014
comment
Я думаю, вам нужно выполнить следующие шаги: 1) Измерить размеры набора точек (используйте boundingRect docs.opencv.org/modules/imgproc/doc/ ). 2) Масштабируйте точку до удобного размера (скажем, шириной 512 пикселей). 3) Сместите верхний левый угол набора точек относительно исходной точки изображения. 4) Нарисуйте точки (вы можете использовать прямую запись в память или, например, cv::rectangle) 5) Примените морфологию. 6) Найдите контуры. В случае использования примитивов рисования (прямоугольники или окружности) оператор растяжения может не понадобиться. - person Andrey Smorodov; 05.02.2014

Я думаю, что вы ищете пакет OKPCL.. Также убедитесь, что вы проверили этот пост PCL о теме.. Существует также класс OpenCVPCL Bridge, но, по-видимому, веб-сайт не работает.

И, наконец, появилось официальное сообщение о том, что OpenCV и PCL объединение усилий для разработки платформы, которая объединяет вычисления на GPU с восприятием и обработкой 2D/3D.

ХТН

person scap3y    schedule 05.02.2014

Вы можете использовать PCL RangeImage соответственно RangeImagePlanar с его классом createFromPointCloud (я думаю, у вас есть облако точек, верно? Или что вы подразумеваете под 3D-изображением?).

Затем вы можете создать OpenCV Mat, используя функции getImagePoint.

person Simson    schedule 06.02.2014