Я написал небольшой фрагмент кода для слияния двух точечных облаков с ICP с использованием PCL. Однако, независимо от того, что я делаю, я получаю последнее облако точек, содержащее только первое облако точек. Картина: Функция PCL ICP не добавляет второе облако точек
#define _CRT_SECURE_NO_DEPRECATE
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/registration/icp.h>
#include <pcl/io/pcd_io.h>
#include <boost/make_shared.hpp>
#include "Dot3DReader.h"
int main(int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>("D:/Imerso/PCL PointCloudExampleData/Frame1.pcd", *cloud1) == -1) //* load the file
{
PCL_ERROR("Couldn't read file Frame1.pcd \n");
return (-1);
}
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>("D:/Imerso/PCL PointCloudExampleData/Frame2.pcd", *cloud2) == -1) //* load the file
{
PCL_ERROR("Couldn't read file Frame2.pcd \n");
return (-1);
}
std::cout << "Read both files." << std::endl;
pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;
icp.setInputSource(cloud1);
icp.setInputTarget(cloud2);
boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ>> Final(new pcl::PointCloud<pcl::PointXYZ>());
std::cout << "Starting aligning." << std::endl;
icp.align(*Final);
std::cout << "Finished aligning." << std::endl;
std::cout << "has converged:" << icp.hasConverged() << " score: " <<
icp.getFitnessScore() << std::endl;
// CloudViewer を生成
// (表示は別スレッドで実行される)
pcl::visualization::CloudViewer viewer("Final cloud Viewer");
// CloudViewer で点群を表示
viewer.showCloud(Final);
while (true) {
// ESC キーで終了
if (GetKeyState(VK_ESCAPE) < 0) {
return 0;
}
}
return 0;
}
В качестве бонуса, я также хочу, чтобы сохранить цвета точек выровнены при использовании точек RGB. Как я могу это сделать?
Я предполагаю, что он не находит соответствия и просто отбрасывает второе облако точек.
Благодарим за помощь.
бы ускорилось, чтобы вместо списка с координатами облако облачной точки изменилось, я имею в виду ширину и высоту, такую же, как карта глубины. В содержании изображений глубины. –
@MartijnvanWezel Вы хотите отфильтровать облако точек, чтобы сделать разреженное представление исходного облака точек, а затем сопоставить их? Затем используйте это преобразование в исходном облаке точек? Если да, то да. В общем случае уменьшение количества точек ускорит алгоритм. Однако это также уменьшит качество результата. Если у вас очень плотное облако, вы можете легко удалить точки, не теряя при этом никакой заметной точности, но вы должны быть осторожны, чтобы не убирать слишком много. –
Нет, я имею в виду, что точки должны быть упорядочены квадратом, а не списком, для лучшей ICP, я в настоящее время занимаюсь этим –