Привет всем!
Есть у меня кучка 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, наверное, глупая идея делать, но мне не для продакшена, для себя.