LINUX.ORG.RU

Анимация облаков точек с использованием библиотеки Point Cloud Library

 , ,


1

2

Привет всем!

Есть у меня кучка PLY файлов, которые получены путём 3D реконструкции, в формате три координаты+три составляющие цвета.
Пытаюсь написать простой топорный просмотрщик анимации из серии файлов.

#include <iostream>

#include <list>
#include <iterator>
#include <string>

#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_cloud.h>
#include <pcl/console/parse.h>
#include <pcl/common/transforms.h>
#include <pcl/visualization/pcl_visualizer.h>

#include <unistd.h>
#include <signal.h>

static bool change_frame = true;

static void handler(int sig){
    change_frame = true;
}

int main (int argc, char** argv){
    bool tr = true;
    std::list<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> sources_list;

    for(int i = 1; i < argc; i++)
    {
        pcl::PointCloud<pcl::PointXYZRGB>::Ptr srccld (new pcl::PointCloud<pcl::PointXYZRGB> ());
        if (pcl::io::loadPLYFile (argv[1], *srccld) < 0)  {
            std::cout << "Error loading point cloud " << argv[1] << std::endl << std::endl;
            return -1;
        }
        sources_list.push_back(srccld);
    }

    signal(SIGALRM, handler);
    ualarm(500000, 500000);

    std::list<pcl::PointCloud<pcl::PointXYZRGB>::Ptr>::iterator it1 = sources_list.begin();
    pcl::visualization::PCLVisualizer viewer ("Matrix transformation example");
    viewer.addCoordinateSystem (1.0, "cloud", 0);
    viewer.setBackgroundColor(0.05, 0.05, 0.05, 0);

    while (!viewer.wasStopped ()) {
        if (change_frame) {
            std::cout << "Changing frame\n";
            change_frame = false;
            if (it1 == sources_list.end()) it1 = sources_list.begin();
            std::cout << *it1 << "\n";
            if (tr) { // Change background for testing
                tr = false;
                viewer.setBackgroundColor(0.05, 0.05, 0.05, 0);
            } else {
                tr = true;
                viewer.setBackgroundColor(0.5, 0.5, 0.5, 0);
            }
            viewer.removeAllPointClouds();
            pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> source_cloud_color_handler (*it1);
            viewer.addPointCloud (*it1, source_cloud_color_handler, "cld");
            viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cld");
            it1++;
        }
        viewer.spinOnce ();
    }
    return 0;
}

Проблема в том, что на экране всё время одно и тоже облако.
Пробовал каждую итерацию присваивать разные идентификаторы, вроде «cld»+номер_кадра, но это ничего не дало.
Для теста сделал смену цвета фона. Вот это работает и фон мигает с нужной частотой.
То ли viewer.removeAllPointClouds(); ничего не удаляет, или надо апдейт сцены какой-то сделать... Не понятно!

P.S.: Ну да, через SIGALRM, наверное, глупая идея делать, но мне не для продакшена, для себя.

★★★★★

Последнее исправление: ls-h (всего исправлений: 1)

Ответ на: комментарий от trex6

Да всё банально. Загружался один и тот же файл много раз вместо разных. И, скорее, не опечатка, а недосмотр.
if (pcl::io::loadPLYFile (argv[1], *srccld) < 0)
вместо этого надо было
if (pcl::io::loadPLYFile (argv, *srccld) < 0)
Эта строчка из примера. Сначала попробовал с одним фалом, а когда приписал цикл, не заметил, что там 1, а не i.

ls-h ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.