Сохранение реконструированного 3D вида Kinect в файл

Я собираюсь запустить проект; реконструировать мою комнату с Kinect.

В каком формате будет сохранен восстановленный 3D-вид?

это может быть сохранить или конвертировать в 3dm, 3ds, max, obj и т. д.?

Спасибо!

2 ответа

Решение

Вы можете легко сохранить 3D-координаты в формате PLY. Вот базовый пример использования ofxKinect:

void exportPlyCloud(string filename, ofMesh& cloud) {
    ofFile ply;
    if (ply.open(filename, ofFile::WriteOnly)) {        
        // write the header
        ply << "ply" << endl;
        ply << "format binary_little_endian 1.0" << endl;
        ply << "element vertex " << cloud.getVertices().size() << endl;
        ply << "property float x" << endl;
        ply << "property float y" << endl;
        ply << "property float z" << endl;
        ply << "end_header" << endl;

        // write all the vertices
        vector<ofVec3f>& surface = cloud.getVertices();
        for(int i = 0; i < surface.size(); i++) {
            if (surface[i].z != 0) {
                // write the raw data as if it were a stream of bytes
                ply.write((char*) &surface[i], sizeof(ofVec3f));
            }
        }
    }
}

Затем вы можете использовать MeshLab для обработки / вставки PLY-файлов, а затем экспортировать их в другой формат, такой как OBJ. В этом семинаре вы можете найти несколько полезных примеров, связанных с openFrameworks, включая экспорт PLY.

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

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

Немного написав код, вы также можете выполнить реконструкцию, используя PointCloudsLibrary(PCL). Если также включает в себя реализацию KinectFusion

PCL Kinfu Предварительный просмотр 1PCL Kinfu Предварительный просмотр 2

Если вы используете Microsoft Kinect SDK, Kinect Fusion был интегрирован в Kinect SDK 1.7

KinectFusion в Kinect SDK 1.7

Вы также можете найти этот пост интересным: Kinect Fusion внутри AutoCAD.

Kinect дает вам изображение глубины. Это изображение с различными оттенками серого, показывающее, как далеко что-то находится от датчика.
Любой пиксель в изображении использует 16 или 13 битов для значения глубины (когда используются только 13 битов, 3 последних бита используются для идентификатора игрока).
Вы можете просто сохранить изображение в формате.bmp, например... или преобразовать его в любой другой формат, который вам больше нравится.

Я не совсем уверен, как вы хотите восстановить свою комнату.
Kinect не может захватить всю комнату сразу, поэтому вам придется по крайней мере повернуть Kinect, чтобы захватить всю комнату.

Какую реконструкцию вы хотите достичь? Это просто изображение в оттенках серого или вам нужны расстояния до стен и объектов, а также их размеры?
Если последний случай, вы должны обработать изображения.
В первом случае вы можете просто склеить отдельные картинки, чтобы сформировать панораму или куб, как вам угодно.

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

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