网站的开发技术,小程序商城开发商华网天下北京,电商界面设计图,怎么查看网站开发语言一、下载visual studio2022
下载网址#xff1a;Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 (microsoft.com) 安装的时候选择使用C的桌面开发“#xff0c;同时可以修改文件路径#xff0c;可以放在D盘。修改文件路径的时候#xff0c;共享组件、…一、下载visual studio2022
下载网址Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 (microsoft.com) 安装的时候选择使用C的桌面开发“同时可以修改文件路径可以放在D盘。修改文件路径的时候共享组件、工具和SDK的路径无法修改可能是因为你之前有安装过Visual studio。可以通过以下操作解决
1.首先WINR输入regedit回车 2.按照这个顺序展开目录
HKEY_LOCAL_MACHINESOFTWAREMicrosoftVisualStudioSetup 3.右键删除SharedInstallationPath 和 CachePath就可以修改共享组件、工具和SDK的路径了
二、安装PCL1.14.0
都是以我自己的安装路径为例
1.下载
官网下载Releases · PointCloudLibrary/pcl · GitHub 只要下载PCL-1.14.0-AllInOne-msvc2022-win64.exe和pcl-1.14.0-pdb-msvc2022-win64.zip两个文件即可。 如果下载太慢我这里已经下载好了
链接https://pan.baidu.com/s/177DvR5gOcVL7iPm4xI7s_w 提取码wstc
2.安装
点击PCL-1.14.0-AllInOne-msvc2022-win64.exe进行安装 下一步 我接受 选择Add PCL to the system Path for all users下一步 可以选择修改路径我自己的路径是C:\Compiler\PCL\PCL 1.14.0你可以选择自己的路径不过一定要记得因为之后配置环境变量要用到然后下一步 没必要创建快捷方式下一步然后点击安装在安装过程中会出现提醒你变量名太长没办法写入环境变量这个时候你直接确定就行等安装完成之后自己配置环境变量。安装完成之后会出现这三个应用 把OpenNi2.2 SDK for Windows 64-bit给卸载掉因为它有默认安装路径即使我们修改文件安装路径它还是安装在默认路径卸载完之后打开C:\Compiler\PCL\PCL 1.14.0\3rdParty\OpenNI2文件夹发现里面有一个OpenNI-Windows-x64-2.2.msi这是安装PCL-1.14.0-AllInOne-msvc2022-win64.exe的时候附带的点击安装可以帮你再次安装OpenNi2.2 SDK for Windows 64-bit而且可以修改成自己的路径我的路径是C:\Compiler\PCL\PCL 1.14.0\3rdParty\OpenNI2 安装完成之后就会包含这些内容
接着把pcl-1.14.0-pdb-msvc2022-win64.zip解压 把里面的所有pdb文件都复制到C:\Compiler\PCL\PCL 1.14.0\bin里面
3.配置环境变量
此电脑右键属性 点击高级系统设置 点击环境变量 确保这四个都存在这是安装PCL-1.14.0-AllInOne-msvc2022-win64.exe的时候自动生成的接着点击Path开始配置环境变量 C:\Compiler\PCL\PCL 1.14.0\bin
C:\Compiler\PCL\PCL 1.14.0\3rdParty\VTK\bin
C:\Compiler\PCL\PCL 1.14.0\3rdParty\OpenNI2\Tools
C:\Compiler\PCL\PCL 1.14.0\3rdParty\OpenNI2\Redist
C:\Compiler\PCL\PCL 1.14.0\3rdParty\Boost\lib
C:\Compiler\PCL\PCL 1.14.0\3rdParty\Qhull\bin
C:\Compiler\PCL\PCL 1.14.0\3rdParty\FLANN\bin
把这几个路径添加进环境变量即可。
三、创建项目
打开visual studio2022 创建新项目 选择空项目下一步 可以修改项目名称和位置创建项目 右键点击源文件添加新项随便取个名字点击添加注意我已经添加过文件了如果是新创建的文件源文件里面是啥也没有的 右键点击解决方案下方的pointCloud这个是项目名称点击属性就会出现这个属性页点击VC目录
C:\Compiler\PCL\PCL 1.14.0\3rdParty\Boost\include\boost-1_84
C:\Compiler\PCL\PCL 1.14.0\3rdParty\Eigen3\include\eigen3
C:\Compiler\PCL\PCL 1.14.0\3rdParty\FLANN\include
C:\Compiler\PCL\PCL 1.14.0\3rdParty\Qhull\include
C:\Compiler\PCL\PCL 1.14.0\3rdParty\VTK\include\vtk-9.3
C:\Compiler\PCL\PCL 1.14.0\3rdParty\OpenNI2\Include
C:\Compiler\PCL\PCL 1.14.0\include\pcl-1.14
把这些路径加入到包含目录里
C:\Compiler\PCL\PCL 1.14.0\3rdParty\FLANN\lib
C:\Compiler\PCL\PCL 1.14.0\3rdParty\Boost\lib
C:\Compiler\PCL\PCL 1.14.0\lib
C:\Compiler\PCL\PCL 1.14.0\3rdParty\VTK\lib
C:\Compiler\PCL\PCL 1.14.0\3rdParty\Qhull\lib
C:\Compiler\PCL\PCL 1.14.0\3rdParty\OpenNI2\Lib
这些路径放到库目录里 然后点击C/C的所有选项把SDL检查改成否 再点击C/C的代码生成修改启用增强指令集为高级适量扩展(X86/X64)(/arch:AVX) BOOST_USE_WINDOWS_H
NOMINMAX
_CRT_SECURE_NO_DEPRECATE
在C/C的预处理器里面的预处理定义增加这三行 pcl_commond.lib
pcl_featuresd.lib
pcl_filtersd.lib
pcl_iod.lib
pcl_io_plyd.lib
pcl_kdtreed.lib
pcl_keypointsd.lib
pcl_mld.lib
pcl_octreed.lib
pcl_outofcored.lib
pcl_peopled.lib
pcl_recognitiond.lib
pcl_registrationd.lib
pcl_sample_consensusd.lib
pcl_searchd.lib
pcl_segmentationd.lib
pcl_stereod.lib
pcl_surfaced.lib
pcl_trackingd.lib
pcl_visualizationd.lib
vtkcgns-9.3-gd.lib
vtkChartsCore-9.3-gd.lib
vtkCommonColor-9.3-gd.lib
vtkCommonComputationalGeometry-9.3-gd.lib
vtkCommonCore-9.3-gd.lib
vtkCommonDataModel-9.3-gd.lib
vtkCommonExecutionModel-9.3-gd.lib
vtkCommonMath-9.3-gd.lib
vtkCommonMisc-9.3-gd.lib
vtkCommonSystem-9.3-gd.lib
vtkCommonTransforms-9.3-gd.lib
vtkDICOMParser-9.3-gd.lib
vtkDomainsChemistry-9.3-gd.lib
vtkDomainsChemistryOpenGL2-9.3-gd.lib
vtkdoubleconversion-9.3-gd.lib
vtkexodusII-9.3-gd.lib
vtkexpat-9.3-gd.lib
vtkFiltersAMR-9.3-gd.lib
vtkFiltersCore-9.3-gd.lib
vtkFiltersExtraction-9.3-gd.lib
vtkFiltersFlowPaths-9.3-gd.lib
vtkFiltersGeneral-9.3-gd.lib
vtkFiltersGeneric-9.3-gd.lib
vtkFiltersGeometry-9.3-gd.lib
vtkFiltersHybrid-9.3-gd.lib
vtkFiltersHyperTree-9.3-gd.lib
vtkFiltersImaging-9.3-gd.lib
vtkFiltersModeling-9.3-gd.lib
vtkFiltersParallel-9.3-gd.lib
vtkFiltersParallelImaging-9.3-gd.lib
vtkFiltersPoints-9.3-gd.lib
vtkFiltersProgrammable-9.3-gd.lib
vtkFiltersSelection-9.3-gd.lib
vtkFiltersSMP-9.3-gd.lib
vtkFiltersSources-9.3-gd.lib
vtkFiltersStatistics-9.3-gd.lib
vtkFiltersTexture-9.3-gd.lib
vtkFiltersTopology-9.3-gd.lib
vtkFiltersVerdict-9.3-gd.lib
vtkfmt-9.3-gd.lib
vtkfreetype-9.3-gd.lib
vtkGeovisCore-9.3-gd.lib
vtkgl2ps-9.3-gd.lib
vtkglew-9.3-gd.lib
vtkhdf5-9.3-gd.lib
vtkhdf5_hl-9.3-gd.lib
vtkImagingColor-9.3-gd.lib
vtkImagingCore-9.3-gd.lib
vtkImagingFourier-9.3-gd.lib
vtkImagingGeneral-9.3-gd.lib
vtkImagingHybrid-9.3-gd.lib
vtkImagingMath-9.3-gd.lib
vtkImagingMorphological-9.3-gd.lib
vtkImagingSources-9.3-gd.lib
vtkImagingStatistics-9.3-gd.lib
vtkImagingStencil-9.3-gd.lib
vtkInfovisCore-9.3-gd.lib
vtkInfovisLayout-9.3-gd.lib
vtkInteractionImage-9.3-gd.lib
vtkInteractionStyle-9.3-gd.lib
vtkInteractionWidgets-9.3-gd.lib
vtkIOAMR-9.3-gd.lib
vtkIOAsynchronous-9.3-gd.lib
vtkIOCesium3DTiles-9.3-gd.lib
vtkIOCGNSReader-9.3-gd.lib
vtkIOChemistry-9.3-gd.lib
vtkIOCityGML-9.3-gd.lib
vtkIOCONVERGECFD-9.3-gd.lib
vtkIOCore-9.3-gd.lib
vtkIOEnSight-9.3-gd.lib
vtkIOExodus-9.3-gd.lib
vtkIOExport-9.3-gd.lib
vtkIOExportGL2PS-9.3-gd.lib
vtkIOExportPDF-9.3-gd.lib
vtkIOGeometry-9.3-gd.lib
vtkIOHDF-9.3-gd.lib
vtkIOImage-9.3-gd.lib
vtkIOImport-9.3-gd.lib
vtkIOInfovis-9.3-gd.lib
vtkIOIOSS-9.3-gd.lib
vtkIOLegacy-9.3-gd.lib
vtkIOLSDyna-9.3-gd.lib
vtkIOMINC-9.3-gd.lib
vtkIOMotionFX-9.3-gd.lib
vtkIOMovie-9.3-gd.lib
vtkIONetCDF-9.3-gd.lib
vtkIOOggTheora-9.3-gd.lib
vtkIOParallel-9.3-gd.lib
vtkIOParallelXML-9.3-gd.lib
vtkIOPLY-9.3-gd.lib
vtkIOSegY-9.3-gd.lib
vtkIOSQL-9.3-gd.lib
vtkioss-9.3-gd.lib
vtkIOTecplotTable-9.3-gd.lib
vtkIOVeraOut-9.3-gd.lib
vtkIOVideo-9.3-gd.lib
vtkIOXML-9.3-gd.lib
vtkIOXMLParser-9.3-gd.lib
vtkjpeg-9.3-gd.lib
vtkjsoncpp-9.3-gd.lib
vtkkissfft-9.3-gd.lib
vtklibharu-9.3-gd.lib
vtklibproj-9.3-gd.lib
vtklibxml2-9.3-gd.lib
vtkloguru-9.3-gd.lib
vtklz4-9.3-gd.lib
vtklzma-9.3-gd.lib
vtkmetaio-9.3-gd.lib
vtknetcdf-9.3-gd.lib
vtkogg-9.3-gd.lib
vtkParallelCore-9.3-gd.lib
vtkParallelDIY-9.3-gd.lib
vtkpng-9.3-gd.lib
vtkpugixml-9.3-gd.lib
vtkRenderingAnnotation-9.3-gd.lib
vtkRenderingContext2D-9.3-gd.lib
vtkRenderingContextOpenGL2-9.3-gd.lib
vtkRenderingCore-9.3-gd.lib
vtkRenderingFreeType-9.3-gd.lib
vtkRenderingGL2PSOpenGL2-9.3-gd.lib
vtkRenderingHyperTreeGrid-9.3-gd.lib
vtkRenderingImage-9.3-gd.lib
vtkRenderingLabel-9.3-gd.lib
vtkRenderingLICOpenGL2-9.3-gd.lib
vtkRenderingLOD-9.3-gd.lib
vtkRenderingOpenGL2-9.3-gd.lib
vtkRenderingSceneGraph-9.3-gd.lib
vtkRenderingUI-9.3-gd.lib
vtkRenderingVolume-9.3-gd.lib
vtkRenderingVolumeOpenGL2-9.3-gd.lib
vtkRenderingVtkJS-9.3-gd.lib
vtksqlite-9.3-gd.lib
vtksys-9.3-gd.lib
vtkTestingRendering-9.3-gd.lib
vtktheora-9.3-gd.lib
vtktiff-9.3-gd.lib
vtkverdict-9.3-gd.lib
vtkViewsContext2D-9.3-gd.lib
vtkViewsCore-9.3-gd.lib
vtkViewsInfovis-9.3-gd.lib
vtkWrappingTools-9.3-gd.lib
vtkzlib-9.3-gd.lib
在链接器的输入的附加依赖项里增加这些配置完成电脑重启即可生效
四、点云配准
#include pcl/point_types.h
#include pcl/point_cloud.h
#include pcl/features/fpfh_omp.h
#include pcl/io/ply_io.h//pcd输入输出头文件
#include pcl/registration/icp.h//点云icp算法头文件
#include pcl/registration/ndt.h//点云NDT算法头文件
#include pcl/registration/ia_ransac.h//点云ransac迭代对齐算法(SAC-IA)算法头文件
#include pcl/registration/gicp.h//点云GICP算法的头文件
#include pcl/visualization/pcl_visualizer.h//点云可视化头文件
#include time.h
#include boost/thread.hpp
#include pcl/features/normal_3d_omp.h
typedef pcl::PointXYZ PointT; //重定义pcl::PointXYZ为PointT
typedef pcl::PointCloudPointT PointCloud; //重定义pcl::PointCloudPointT为PointCloud
//点云配准类型
typedef pcl::IterativeClosestPointpcl::PointXYZ, pcl::PointXYZ ICP;
typedef pcl::NormalDistributionsTransformpcl::PointXYZ, pcl::PointXYZ NDT;
typedef pcl::SampleConsensusInitialAlignmentpcl::PointXYZ, pcl::PointXYZ, pcl::FPFHSignature33 SAC_IA;
typedef pcl::GeneralizedIterativeClosestPointpcl::PointXYZ, pcl::PointXYZ GICP;
//FPFH特征
typedef pcl::FPFHEstimationOMPpcl::PointXYZ, pcl::Normal, pcl::FPFHSignature33 FPFHEstimation;
typedef pcl::PointCloudpcl::FPFHSignature33 FPFH;
//法线估计
typedef pcl::NormalEstimationOMPpcl::PointXYZ, pcl::Normal NormalEstimation;
typedef pcl::PointCloudpcl::Normal Normal;
typedef pcl::search::KdTreepcl::PointXYZ KdTreeT;//点云可视化
void visualize_pcd(PointCloud::Ptr pcd_src,PointCloud::Ptr pcd_tgt,PointCloud::Ptr pcd_final)
{pcl::visualization::PCLVisualizer viewer(registration Viewer);// 设置背景viewer.setBackgroundColor(1, 1, 1);// 添加坐标轴到可视化对象参数指定轴的大小长度这里设置为1.0单位长度viewer.addCoordinateSystem(0.5);// 设置相机位置和方向viewer.initCameraParameters();pcl::visualization::PointCloudColorHandlerCustomPointT src_h(pcd_src, 0, 255, 0);pcl::visualization::PointCloudColorHandlerCustomPointT tgt_h(pcd_tgt, 255, 0, 0);pcl::visualization::PointCloudColorHandlerCustomPointT final_h(pcd_final, 0, 0, 255);//viewer.addPointCloud(pcd_src, src_h, source cloud); //source绿色viewer.addPointCloud(pcd_tgt, tgt_h, tgt cloud); //target红色viewer.addPointCloud (pcd_final, final_h, final cloud); //final蓝色while (!viewer.wasStopped()){viewer.spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(1000));}
}void printinfo(Eigen::Matrix4f icp_trans, Eigen::Matrix3f rotation, Eigen::Vector3f translation, Eigen::Vector3f euler_angles_deg,Eigen::Quaternionf quaternion)
{cout.setf(ios::fixed);cout.precision(5);cout endl Transformation matrix: endl icp_trans endl;//输出变换矩阵cout endl Rotation matrix: endl rotation endl;cout endl Translation vector: endl translation endl;cout endl Euler Angle: endl;cout endl roll(x): euler_angles_deg[2] endl;cout endl pitch(y): euler_angles_deg[1] endl;cout endl yaw(z): euler_angles_deg[0] endl;// 输出四元数,由于欧拉角时常出现万向节所以可以使用四元数来表示旋转这样更精确cout endl Rotation quaternion: endl w quaternion.w() endl , x quaternion.x() endl , y quaternion.y() endl , z quaternion.z() endl;
}void downsampling(PointCloud::Ptr cloud_src_o, PointCloud::Ptr cloud_tgt_o,pcl::VoxelGridpcl::PointXYZ::Ptr voxel_grid)
{float leaf 0.005f;voxel_grid-setLeafSize(leaf, leaf, leaf); // 示例叶子大小voxel_grid-setInputCloud(cloud_src_o);voxel_grid-filter(*cloud_src_o);voxel_grid-setInputCloud(cloud_tgt_o);voxel_grid-filter(*cloud_tgt_o);
}
void normalestimation(NormalEstimation ne, Normal::Ptr src_normals, Normal::Ptr tgt_normals, KdTreeT::Ptr tree, PointCloud::Ptr cloud_src_o, PointCloud::Ptr cloud_tgt_o)
{创建一个NormalEstimationOMP对象,进行法线计算;ne.setSearchMethod(tree);ne.setKSearch(20);ne.setInputCloud(cloud_src_o);ne.compute(*src_normals);ne.setInputCloud(cloud_tgt_o);ne.compute(*tgt_normals);cout 原点云法线计算完成 endl *src_normals endl;cout 目标点云法线计算完成 endl *tgt_normals endl;
}void fpfh_features(FPFHEstimation fpfh, FPFH::Ptr src_fpfhs,FPFH::Ptr tgt_fpfhs, PointCloud::Ptr cloud_src_o, PointCloud::Ptr cloud_tgt_o, KdTreeT::Ptr tree, Normal::Ptr src_normals, Normal::Ptr tgt_normals)
{fpfh.setSearchMethod(tree);fpfh.setRadiusSearch(0.05); // Use a radius search instead of a KdTree searchfpfh.setInputCloud(cloud_src_o);fpfh.setInputNormals(src_normals);fpfh.compute(*src_fpfhs);fpfh.setInputCloud(cloud_tgt_o);fpfh.setInputNormals(tgt_normals);fpfh.compute(*tgt_fpfhs);cout 原点云特征计算完成 *src_fpfhs endl; cout 目标点云特征计算完成 *tgt_fpfhs endl;
}GICP gicp_registration(GICP gicp, PointCloud final_cloud,PointCloud::Ptr cloud_src_o, PointCloud::Ptr cloud_tgt_o)
{gicp.setInputSource(cloud_src_o);gicp.setInputTarget(cloud_tgt_o);// 配准时最大迭代次数gicp.setMaximumIterations(50);// 两次变化矩阵之间的差异小于这个阈值时就认为已经收敛停止迭代gicp.setTransformationEpsilon(1e-6);// 对应点之间的最大距离gicp.setMaxCorrespondenceDistance(0.05);// 采用随机采样一致性方法进行配准gicp.setRANSACOutlierRejectionThreshold(1.5);// 最小内点比例。在RANSAC配准方法中当内点的比例小于此值时认为配准失败。gicp.setRANSACIterations(20);// 执行配准并将结果存储在Final中gicp.align(final_cloud);return gicp;}
SAC_IA sacia_registration(SAC_IA sac_ia, PointCloud final_cloud,PointCloud::Ptr cloud_src_o, PointCloud::Ptr cloud_tgt_o,FPFH::Ptr src_fpfhs, FPFH::Ptr tgt_fpfhs)
{sac_ia.setInputSource(cloud_src_o);sac_ia.setSourceFeatures(src_fpfhs);sac_ia.setInputTarget(cloud_tgt_o);sac_ia.setTargetFeatures(tgt_fpfhs);// 设置SAC-IA配准的参数sac_ia.setMinSampleDistance(0.05f);sac_ia.setMaxCorrespondenceDistance(0.01f);sac_ia.setMaximumIterations(500);// 创建一个空的PointCloud对象来接收结果pcl::PointCloudpcl::PointXYZ final_registration;// 执行配准并将结果存储在final_registration中sac_ia.align(final_registration);return sac_ia;
}
NDT ndt_registration(NDT ndt, PointCloud final_cloud,PointCloud::Ptr cloud_src_o, PointCloud::Ptr cloud_tgt_o)
{// 配置NDTndt.setTransformationEpsilon(0.1);ndt.setStepSize(0.5);ndt.setResolution(2.0);ndt.setMaximumIterations(20);ndt.setInputSource(cloud_src_o);ndt.setInputTarget(cloud_tgt_o);ndt.align(final_cloud);return ndt;
}ICP icp_registration(ICP icp, PointCloud final_cloud, PointCloud::Ptr cloud_src_o, PointCloud::Ptr cloud_tgt_o)
{icp.setMaximumIterations(50);// 两次变化矩阵之间的差值icp.setTransformationEpsilon(1e-10);// 均方误差icp.setEuclideanFitnessEpsilon(0.01);icp.setInputSource(cloud_src_o);//录入source点云icp.setInputTarget(cloud_tgt_o);//录入target点云icp.align(final_cloud);//最终配准结果return icp;
}
int main(int argc, char** argv)
{//加载点云文件PointCloud::Ptr cloud_src_o(new pcl::PointCloudpcl::PointXYZ);//原点云待配准pcl::io::loadPLYFile(ply/bun_zipper.ply, *cloud_src_o);PointCloud::Ptr cloud_tgt_o(new pcl::PointCloudpcl::PointXYZ);//目标点云pcl::io::loadPLYFile(ply/bun_zipper2.ply, *cloud_tgt_o);clock_t start clock();//下采样pcl::VoxelGridpcl::PointXYZ::Ptr voxel_grid(new pcl::VoxelGridpcl::PointXYZ);downsampling(cloud_src_o, cloud_tgt_o, voxel_grid);创建一个NormalEstimationOMP对象,进行法线计算NormalEstimation ne;Normal::Ptr src_normals(new pcl::PointCloudpcl::Normal);Normal::Ptr tgt_normals(new pcl::PointCloudpcl::Normal);KdTreeT::Ptr tree(new pcl::search::KdTreepcl::PointXYZ());normalestimation(ne, src_normals, tgt_normals, tree, cloud_src_o, cloud_tgt_o);//计算FPFH特征/*FPFHEstimation fpfh;FPFH::Ptr src_fpfhs(new pcl::PointCloudpcl::FPFHSignature33());FPFH::Ptr tgt_fpfhs(new pcl::PointCloudpcl::FPFHSignature33());fpfh_features(fpfh, src_fpfhs, tgt_fpfhs, cloud_src_o, cloud_tgt_o, tree, src_normals, tgt_normals);*/// 点云配准PointCloud::Ptr icp_result(new pcl::PointCloudpcl::PointXYZ);PointCloud final_cloud;ICP icp;ICP reg_p icp_registration(icp, final_cloud, cloud_src_o, cloud_tgt_o);/*NDT ndt;NDT reg_p ndt_registration(ndt, final_cloud, cloud_src_o, cloud_tgt_o);*//*GICP gicp;GICP reg_p gicp_registration(gicp, final_cloud, cloud_src_o, cloud_tgt_o);*///SAC_IA sac_ia;//SAC_IA reg_p sacia_registration(sac_ia, final_cloud, cloud_src_o, cloud_tgt_o, src_fpfhs, tgt_fpfhs);clock_t end clock();cout total time: (double)(end - start) / (double)CLOCKS_PER_SEC s endl;//输出配准所用时间cout ICP has converged: reg_p.hasConverged() score: reg_p.getFitnessScore() std::endl;Eigen::Matrix4f reg_p_trans;// 变换矩阵reg_p_trans reg_p.getFinalTransformation();// 平移向量Eigen::Vector3f translation reg_p_trans.block3, 1(0, 3);// 旋转矩阵Eigen::Matrix3f rotation reg_p_trans.block3, 3(0, 0);// 转换为四元数Eigen::Quaternionf quaternion(rotation);// 使用四元数重新计算欧拉角Eigen::Vector3f euler_angles_rad quaternion.toRotationMatrix().eulerAngles(2, 1, 0);获取欧拉角弧度//Eigen::Vector3f euler_angles_rad rotation.eulerAngles(0, 1, 2);// 将弧度转换为角度Eigen::Vector3f euler_angles_deg euler_angles_rad * 180.0 / M_PI;printinfo(reg_p_trans, rotation, translation, euler_angles_deg, quaternion);//使用创建的变换对未过滤的输入点云进行变换pcl::transformPointCloud(*cloud_src_o, *icp_result, reg_p_trans);visualize_pcd(cloud_src_o, cloud_tgt_o, icp_result);return (0);
}这里面有四种点云配准方法ICPNDTGICPSAC-IA其中使用SAC-IA的时候要把fpfh计算的代码解开注释其他算法使用的时候不需要解开fpfh计算的代码提醒下fpfh和SAC-IA计算较为缓慢出结果需要四五分钟
这份配准所需点云文件链接
链接https://pan.baidu.com/s/1QduGSfYcMN2MLRa08e0eSg 提取码wstc
五、保存配置
为了在以后新建项目时不重复进行第三部分的配置可以保存属性表点击visual studio2022的视图下的其他窗口找到属性管理器点击 下方会出现属性管理器的字样点击 然后右键Debug | x64点击添加新项目属性表 随便命个名点击添加我命名为PCL.props 这里就会出现PCL的属性表双击之后重复第三部分的配置即可这个属性表会保存在和你的cpp文件的同级目录下
然后你就可以新建一个项目在新项目中也找到Debug | x64右键添加现有属性表找到我们刚才配置的PCL.props就可以导入我们刚才的配置了
六、未来如果你要用PCL做某些大型项目可能会遇到 fatal error C1128: 节数超过对象文件格式限制: 请使用 /bigobj 进行编译这种问题解决方法
打开该项目的“属性页”对话框单击“C/C”项单击“命令行”属性页在“附加选项”框中键入编译器选项,添加 /bigobj再次编译即可。
在 Visual Studio 中使用 /bigobj 编译选项的主要好处是允许生成更大的对象文件。这是通过扩展 COFFCommon Object File Format的限制来实现的。以下是 /bigobj 选项的一些具体好处 增加节的数量限制 正常情况下COFF 格式的对象文件有限制例如节的数量不能超过 2^16-165535。使用 /bigobj 可以将这个限制提高到 2^32-1约 4.29 亿这对于包含大量代码的大型项目非常有用。 提供更多的符号 对于有大量符号例如函数、变量、模板实例化的代码/bigobj 也提供了更多的符号支持。 处理复杂的模板 使用大量模板特化和模板元编程的 C 代码可能会生成非常大的对象文件。/bigobj 让编译器能够处理这些复杂的模板情况。 适用于大型项目 对于非常大的项目尤其是那些有大量源代码文件或者是由多个库组合而成的项目使用 /bigobj 选项可以避免在编译过程中出现对象文件格式限制的错误。
使用 /bigobj 选项没有显著的缺点除了可能会增加编译后的对象文件大小。然而它确实是解决某些大型或复杂项目导致的对象文件格式限制问题的必要手段。如果你的项目没有遇到相关的编译限制问题那么通常不需要使用这个选项。