解析
同时调用 setInputCorrespondences()
和 getCorrespondences()
相当于调用 getRemainingCorrespondences()
。
以下两段代码对于同一点云数据计算得到的结果是相同的。
pcl::registration::CorrespondenceRejectorSurfaceNormal rejector;
rejector.initializeDataContainer<pcl::PointNormal, pcl::PointNormal>();
rejector.setInputSource<pcl::PointNormal>(source_normals);
rejector.setInputTarget<pcl::PointNormal>(target_normals);
rejector.setInputNormals<pcl::PointNormal, pcl::PointNormal>(source_normals);
rejector.setTargetNormals<pcl::PointNormal, pcl::PointNormal>(target_normals);
float threshold = cos(M_PI * 10 / 180);
rejector.setThreshold(threshold);
boost::shared_ptr<pcl::Correspondences> correspondences_after_rejector(new pcl::Correspondences);
rejector.getRemainingCorrespondences(*all_correspondences, *correspondences_after_rejector);
pcl::registration::CorrespondenceRejectorSurfaceNormal rejector;
rejector.initializeDataContainer<pcl::PointNormal, pcl::PointNormal>();
rejector.setInputSource<pcl::PointNormal>(source_normals);
rejector.setInputTarget<pcl::PointNormal>(target_normals);
rejector.setInputNormals<pcl::PointNormal, pcl::PointNormal>(source_normals);
rejector.setTargetNormals<pcl::PointNormal, pcl::PointNormal>(target_normals);
rejector.setInputCorrespondences(all_correspondences);
float threshold = cos(M_PI * 10 / 180);
rejector.setThreshold(threshold);
pcl::CorrespondencesPtr correspondences_after_rejector(new pcl::Correspondences);
rejector.getCorrespondences(*correspondences_after_rejector);
源码
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/features/normal_3d_omp.h>
#include <pcl/registration/correspondence_estimation_normal_shooting.h>
#include <pcl/registration/correspondence_rejection_surface_normal.h>
#include <pcl/registration/transformation_estimation_lm.h>
#include <boost/thread/thread.hpp>
#include <pcl/visualization/pcl_visualizer.h>
using namespace std;
void compute_normal(pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud, pcl::PointCloud<pcl::PointNormal>::Ptr& normals)
{
pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::PointNormal> n;
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
n.setNumberOfThreads(6);
n.setInputCloud(cloud);
n.setSearchMethod(tree);
n.setKSearch(10);
n.compute(*normals);
}
int
main(int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr target(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>(argv[1], *target) == -1)
{
PCL_ERROR("读取目标点云失败 \n");
return (-1);
}
cout << "从目标点云中读取 " << target->size() << " 个点" << endl;
pcl::PointCloud<pcl::PointXYZ>::Ptr source(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>(argv[2], *source) == -1)
{
PCL_ERROR("读取源标点云失败 \n");
return (-1);
}
cout << "从源点云中读取 " << source->size() << " 个点" << endl;
pcl::PointCloud<pcl::PointNormal>::Ptr source_normals(new pcl::PointCloud<pcl::PointNormal>);
compute_normal(source,source_normals);
pcl::PointCloud<pcl::PointNormal>::Ptr target_normals(new pcl::PointCloud<pcl::PointNormal>);
compute_normal(target, target_normals);
pcl::registration::CorrespondenceEstimationNormalShooting<pcl::PointXYZ, pcl::PointXYZ, pcl::PointNormal>core;
core.setInputSource(source);
core.setSourceNormals(source_normals);
core.setInputTarget(target);
core.setKSearch(10);
pcl::CorrespondencesPtr all_correspondences(new pcl::Correspondences);
core.determineCorrespondences(*all_correspondences, 10);
pcl::registration::CorrespondenceRejectorSurfaceNormal rejector;
rejector.initializeDataContainer<pcl::PointNormal, pcl::PointNormal>();
rejector.setInputSource<pcl::PointNormal>(source_normals);
rejector.setInputTarget<pcl::PointNormal>(target_normals);
rejector.setInputNormals<pcl::PointNormal, pcl::PointNormal>(source_normals);
rejector.setTargetNormals<pcl::PointNormal, pcl::PointNormal>(target_normals);
rejector.setInputCorrespondences(all_correspondences);
float threshold = cos(M_PI * 10 / 180);
rejector.setThreshold(threshold);
pcl::CorrespondencesPtr correspondences_after_rejector(new pcl::Correspondences);
rejector.getCorrespondences(*correspondences_after_rejector);
Eigen::Matrix4f transformation = Eigen::Matrix4f::Identity();
pcl::registration::TransformationEstimationLM<pcl::PointXYZ, pcl::PointXYZ> trans_est_lm;
trans_est_lm.estimateRigidTransformation(*source, *target, *correspondences_after_rejector, transformation);
pcl::PointCloud<pcl::PointXYZ>::Ptr out(new pcl::PointCloud<pcl::PointXYZ>);
pcl::transformPointCloud(*source, *out, transformation);
pcl::io::savePCDFile("left.pcd", *out);
cout << "原始匹配点对有:" << all_correspondences->size() << "对" << endl;
cout << "剔除错误点对后有:" << correspondences_after_rejector->size() << "对" << endl;
cout <<"LM求解的变换矩阵为:\n"<< transformation << endl;
boost::shared_ptr<pcl::visualization::PCLVisualizer>viewer(new pcl::visualization::PCLVisualizer("显示点云"));
viewer->setBackgroundColor(0, 0, 0);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>input_color(source, 0, 255, 0);
viewer->addPointCloud<pcl::PointXYZ>(source, input_color, "source");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "source");
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>target_color(target, 255, 0, 0);
viewer->addPointCloud<pcl::PointXYZ>(target, target_color, "target");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "target");
viewer->addCorrespondences<pcl::PointXYZ>(source, target, *correspondences_after_rejector, "correspondence");
viewer->initCameraParameters();
viewer->addText("RejectorSurfaceNormal", 10, 10, "text");
viewer->spin();
return 0;
}
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/features/normal_3d_omp.h>
#include <pcl/registration/correspondence_estimation_normal_shooting.h>
#include <pcl/registration/correspondence_rejection_surface_normal.h>
#include <pcl/registration/transformation_estimation_lm.h>
#include <boost/thread/thread.hpp>
#include <pcl/visualization/pcl_visualizer.h>
using namespace std;
void compute_normal(pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud, pcl::PointCloud<pcl::PointNormal>::Ptr& normals)
{
pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::PointNormal> n;
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
n.setNumberOfThreads(6);
n.setInputCloud(cloud);
n.setSearchMethod(tree);
n.setKSearch(10);
n.compute(*normals);
}
int
main(int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr target(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>(argv[1], *target) == -1)
{
PCL_ERROR("读取目标点云失败 \n");
return (-1);
}
cout << "从目标点云中读取 " << target->size() << " 个点" << endl;
pcl::PointCloud<pcl::PointXYZ>::Ptr source(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>(argv[2], *source) == -1)
{
PCL_ERROR("读取源标点云失败 \n");
return (-1);
}
cout << "从源点云中读取 " << source->size() << " 个点" << endl;
pcl::PointCloud<pcl::PointNormal>::Ptr source_normals(new pcl::PointCloud<pcl::PointNormal>);
compute_normal(source,source_normals);
pcl::PointCloud<pcl::PointNormal>::Ptr target_normals(new pcl::PointCloud<pcl::PointNormal>);
compute_normal(target, target_normals);
pcl::registration::CorrespondenceEstimationNormalShooting<pcl::PointXYZ, pcl::PointXYZ, pcl::PointNormal>core;
core.setInputSource(source);
core.setSourceNormals(source_normals);
core.setInputTarget(target);
core.setKSearch(10);
boost::shared_ptr<pcl::Correspondences> all_correspondences(new pcl::Correspondences);
core.determineCorrespondences(*all_correspondences, 10);
pcl::registration::CorrespondenceRejectorSurfaceNormal rejector;
rejector.initializeDataContainer<pcl::PointNormal, pcl::PointNormal>();
rejector.setInputSource<pcl::PointNormal>(source_normals);
rejector.setInputTarget<pcl::PointNormal>(target_normals);
rejector.setInputNormals<pcl::PointNormal, pcl::PointNormal>(source_normals);
rejector.setTargetNormals<pcl::PointNormal, pcl::PointNormal>(target_normals);
float threshold = cos(M_PI * 10 / 180);
rejector.setThreshold(threshold);
boost::shared_ptr<pcl::Correspondences> correspondences_after_rejector(new pcl::Correspondences);
rejector.getRemainingCorrespondences(*all_correspondences, *correspondences_after_rejector);
Eigen::Matrix4f transformation = Eigen::Matrix4f::Identity();
pcl::registration::TransformationEstimationLM<pcl::PointXYZ, pcl::PointXYZ> trans_est_lm;
trans_est_lm.estimateRigidTransformation(*source, *target, *correspondences_after_rejector, transformation);
pcl::PointCloud<pcl::PointXYZ>::Ptr out(new pcl::PointCloud<pcl::PointXYZ>);
pcl::transformPointCloud(*source, *out, transformation);
pcl::io::savePCDFile("left.pcd", *out);
cout << "原始匹配点对有:" << all_correspondences->size() << "对" << endl;
cout << "剔除错误点对后有:" << correspondences_after_rejector->size() << "对" << endl;
cout <<"LM求解的变换矩阵为:\n"<< transformation << endl;
boost::shared_ptr<pcl::visualization::PCLVisualizer>viewer(new pcl::visualization::PCLVisualizer("显示点云"));
viewer->setBackgroundColor(0, 0, 0);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>input_color(source, 0, 255, 0);
viewer->addPointCloud<pcl::PointXYZ>(source, input_color, "source");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "source");
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>target_color(target, 255, 0, 0);
viewer->addPointCloud<pcl::PointXYZ>(target, target_color, "target");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "target");
viewer->addCorrespondences<pcl::PointXYZ>(source, target, *correspondences_after_rejector, "correspondence");
viewer->initCameraParameters();
viewer->addText("RejectorSurfaceNormal", 10, 10, "text");
viewer->spin();
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)