PCL错误:‘int64_t‘不是一个类型

66 篇文章 ¥59.90 ¥99.00
本文介绍了在使用PCL库时遇到'int64_t'不是一个类型错误的原因及解决方案。错误源于'int64_t'并非PCL库内定义的类型,而应使用PCL提供的或类型。通过修正类型,可以避免此类错误并正确处理点云数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在编程中,经常会遇到各种类型错误。本文将讨论一个常见的错误,即PCL中的’int64_t’不是一个类型的错误。我们将解释这个错误的原因,并提供一个例子来说明如何解决它。

PCL(Point Cloud Library)是一个广泛使用的开源库,用于处理和分析点云数据。它提供了许多用于点云处理的功能和数据结构。在使用PCL时,你可能会遇到类型错误,其中一个常见的错误是关于’int64_t’类型的问题。

'int64_t’是一个定义在C++标准库中的整数类型,用于表示带符号的64位整数。它通常在需要处理大整数值时使用。然而,‘int64_t’并不是PCL库中定义的类型,因此当你在使用PCL时,如果错误地使用’int64_t’,编译器将会报告此错误。

要解决这个错误,你需要使用PCL库中提供的正确的类型来替代’int64_t’。例如,如果你需要使用64位整数类型,你可以使用PCL库中的pcl::int64_tpcl::uint64_t类型,它们分别用于有符号和无符号的64位整数。

下面是一个示例代码,展示了如何在PCL中使用正确的64位整数类型:

#include <pcl/common/common.h>

void PointProcessing::coarseRegistration( std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr>& clusters, // 多簇源点云 pcl::PointCloud<pcl::PointXYZ>::Ptr& target, // 目标点云 std::vector<Eigen::Matrix4f>& transformation_matrices, // 输出变换矩阵集合 float sac_ia_max_distance, // SAC-IA最大对应距离 int feature_radius // FPFH特征半径 ) { transformation_matrices.clear(); // 遍历每个簇 for (const auto& cluster : clusters) { // --- 1. 源簇关键点提取 --- pcl::PointCloud<pcl::PointXYZ>::Ptr src_keypoints(new pcl::PointCloud<pcl::PointXYZ>); pcl::UniformSampling<pcl::PointXYZ> uniform_sampling; uniform_sampling.setInputCloud(cluster); uniform_sampling.setRadiusSearch(2.0); // 关键点采样半径(可参数化) uniform_sampling.filter(*src_keypoints); // --- 2. 目标关键点提取(复用同一采样器)--- pcl::PointCloud<pcl::PointXYZ>::Ptr tgt_keypoints(new pcl::PointCloud<pcl::PointXYZ>); uniform_sampling.setInputCloud(target); uniform_sampling.filter(*tgt_keypoints); // --- 3. 使用自定义函数计算法线 --- pcl::PointCloud<pcl::Normal>::Ptr src_normals(new pcl::PointCloud<pcl::Normal>); computernormals(src_keypoints, src_normals, 5.0); // 法线半径5.0 pcl::PointCloud<pcl::Normal>::Ptr tgt_normals(new pcl::PointCloud<pcl::Normal>); computernormals(tgt_keypoints, tgt_normals, 5.0); // --- 4. 使用自定义函数计算FPFH特征 --- pcl::PointCloud<pcl::FPFHSignature33>::Ptr src_features(new pcl::FPFHSignature33); computerFPFH(src_keypoints, src_normals, src_features, feature_radius); pcl::PointCloud<pcl::FPFHSignature33>::Ptr tgt_features(new pcl::FPFHSignature33); computerFPFH(tgt_keypoints, tgt_normals, tgt_features, feature_radius); // --- 5. SAC-IA配准 --- pcl::SampleConsensusInitialAlignment<pcl::PointXYZ, pcl::PointXYZ, pcl::FPFHSignature33> sac_ia; sac_ia.setInputSource(src_keypoints); sac_ia.setSourceFeatures(src_features); sac_ia.setInputTarget(tgt_keypoints); sac_ia.setTargetFeatures(tgt_features); sac_ia.setMaxCorrespondenceDistance(sac_ia_max_distance); pcl::PointCloud<pcl::PointXYZ>::Ptr aligned(new pcl::PointCloud<pcl::PointXYZ>); sac_ia.align(*aligned); // 无返回值,直接执行 // 检查变换矩阵有效性 Eigen::Matrix4f matrix = sac_ia.getFinalTransformation(); if (!matrix.isZero() && !matrix.hasNaN()) { transformation_matrices.push_back(matrix); } else { transformation_matrices.push_back(Eigen::Matrix4f::Identity()); } } } 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C2440 “初始化”: 无法从“Y *”转换为“pcl::PointCloud<pcl::FPFHSignature33> *” PCL_Debug d:\program files\pcl 1.8.1\3rdparty\boost\include\boost-1_64\boost\smart_ptr\shared_ptr.hpp 362 错误 C2439 “boost::shared_ptr<pcl::PointCloud<pcl::FPFHSignature33>>::px”: 未能初始化成员 PCL_Debug d:\program files\pcl 1.8.1\3rdparty\boost\include\boost-1_64\boost\smart_ptr\shared_ptr.hpp 362
03-08
void QtWidgets1::pushButton2_C() { if (!cloudrgb || cloudrgb->empty()) { QMessageBox::warning(this, "警告", "点云数据为空!"); return; } // 使用局部变量隔离操作 pcl::PointCloud<pcl::PointXYZRGB>::Ptr temp_cloud(new pcl::PointCloud<pcl::PointXYZRGB>); pcl::copyPointCloud(*cloudrgb, *temp_cloud); // 深拷贝原始数据 pcl::PointIndices::Ptr inliers(new pcl::PointIndices); pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients); pcl::SACSegmentation<pcl::PointXYZRGB> seg; seg.setOptimizeCoefficients(true); seg.setModelType(pcl::SACMODEL_PLANE); seg.setMethodType(pcl::SAC_RANSAC); seg.setMaxIterations(1000); seg.setDistanceThreshold(0.01); seg.setInputCloud(temp_cloud); seg.segment(*inliers, *coefficients); // 检查索引合法性 if (inliers->indices.empty()) { QMessageBox::warning(this, "警告", "未检测到平面结构!"); return; } // 提取非平面部分 pcl::ExtractIndices<pcl::PointXYZRGB> extract; extract.setInputCloud(temp_cloud); extract.setIndices(inliers); extract.setNegative(true); pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZRGB>); extract.filter(*cloud_filtered); // 安全更新点云数据 { std::lock_guard<std::mutex> lock(cloud_mutex); // 加锁防止竞争 cloudrgb.swap(cloud_filtered); // 原子操作交换指针 } // 强制更新可视化 pSliderValueChangeed(0); QMessageBox::information(this, "提示", "台面分割完成!"); } void QtWidgets1::pushButton3_C() { if (!cloudrgb || cloudrgb->empty()) { QMessageBox::warning(this, "警告", "点云数据为空!"); return; } pcl::PointCloud<pcl::PointXYZRGB>::Ptr temp_cloud(new pcl::PointCloud<pcl::PointXYZRGB>); pcl::copyPointCloud(*cloudrgb, *temp_cloud); // 动态计算距离阈值(修正采样逻辑) pcl::KdTreeFLANN<pcl::PointXYZRGB> kdtree; kdtree.setInputCloud(temp_cloud); float avg_distance = 0.0; size_t sample_count = std::min<size_t>(1000, temp_cloud->size()); for (size_t i = 0; i < sample_count; ++i) { std::vector<int> indices(2); std::vector<float> distances(2); if (kdtree.nearestKSearch(i, 2, indices, distances) > 1) { avg_distance += sqrt(distances[1]); } } avg_distance /= sample_count; float distance_threshold = 2.5 * avg_distance; // 配置 RANSAC 参数 pcl::SACSegmentation<pcl::PointXYZRGB> seg; seg.setOptimizeCoefficients(true); seg.setModelType(pcl::SACMODEL_PLANE); seg.setMethodType(pcl::SAC_RANSAC); seg.setMaxIterations(5000); // 初始较大值 seg.setDistanceThreshold(distance_threshold); // 执行分割 pcl::PointIndices::Ptr inliers(new pcl::PointIndices); pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients); seg.setInputCloud(cloudrgb); seg.segment(*inliers, *coefficients); // 若未找到平面,逐步放宽阈值 if (inliers->indices.empty()) { QMessageBox::warning(this, "警告", "未检测到平面结构!"); return; } // 提取非平面部分 pcl::ExtractIndices<pcl::PointXYZRGB> extract; extract.setInputCloud(temp_cloud); extract.setIndices(inliers); extract.setNegative(true); pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZRGB>); extract.filter(*cloud_filtered); // 安全更新点云 { std::lock_guard<std::mutex> lock(cloud_mutex); cloudrgb.swap(cloud_filtered); } pSliderValueChangeed(0); QMessageBox::information(this, "提示", "台面分割完成!"); }在第一次触发任何一个模块后并无问题,当第二次触发任何模块,在其运行完成且显示正确的图像后点击“台面分割完成”的确认后出现之前说的错误
最新发布
03-08
/* 多源异构点云配准数据的滤波及精度分析 */ #include <pcl/io/pcd_io.h>// 点云文件I/O #include <pcl/surface/mls.h>// 移动最小二乘曲面重建 #include <pcl/point_types.h>// 点类型定义 #include <pcl/filters/voxel_grid.h>// 体素网格下采样 #include <pcl/features/normal_3d_omp.h> // 多线程法线估计 #include <pcl/visualization/pcl_visualizer.h> // 可视化模块 #include <pcl/filters/radius_outlier_removal.h> // 半径离群点移除 #include <pcl/filters/statistical_outlier_removal.h>// 统计离群点移除 using namespace std; int main(int argc, char** argv) { pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_a(new pcl::PointCloud<pcl::PointXYZ>); string path = "D:\\新建文件夹\\点云数据集\\Point Cloud Library Files PCD datasets\\kitchen\\Rf3.pcd"; if (pcl::io::loadPCDFile<pcl::PointXYZ>(path, *cloud_a) == -1) { PCL_ERROR("Couldn't read file test_pcd.pcd \n"); return (-1); } //*******多源异构********** pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1(new pcl::PointCloud<pcl::PointXYZ>); pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor; sor.setInputCloud(cloud_a); sor.setMeanK(15); // 邻域点数量 sor.setStddevMulThresh(1); // 标准差倍数阈值 sor.filter(*cloud1); // 输出到cloud1,邻域15个点,距离均值超过1倍标准差视为离群点 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud11(new pcl::PointCloud<pcl::PointXYZ>); pcl::VoxelGrid<pcl::PointXYZ> grid; grid.setInputCloud(cloud1); Eigen::Vector4f leaf_size{ 0.08,0.08,0.08,0 }; grid.setLeafSize(leaf_size); grid.filter(*cloud11); pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZ>); pcl::RadiusOutlierRemoval<pcl::PointXYZ> ror; ror.setInputCloud(cloud11); ror.setRadiusSearch(0.1); ror.setMinNeighborsInRadius(1); ror.filter(*cloud2); pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>); pcl::PointCloud<pcl::PointNormal>::Ptr mls_points_normal(new pcl::PointCloud<pcl::PointNormal>); pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls; mls.setInputCloud(cloud2); mls.setComputeNormals(true); // mls.setPolynomialFit(true); mls.setPolynomialOrder(2); // MLS拟合的阶数 mls.setSearchMethod(tree); mls.setSearchRadius(0.3); // 邻域搜索半径 mls.setNumberOfThreads(4); mls.process(*mls_points_normal); cout << "mls poits size is: " << mls_points_normal->size() << endl; pcl::io::savePCDFileASCII("多源异构.pcd", *mls_points_normal); pcl::PointCloud<pcl::PointXYZ>::Ptr cloud3(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile<pcl::PointXYZ>("多源异构.pcd", *cloud3); // -----------------------------可视化----------------------------------- pcl::visualization::PCLVisualizer viewer("Cloud Viewer"); int v1 = 0; int v2 = 1; viewer.createViewPort(0, 0, 0.5, 1, v1); viewer.createViewPort(0.5, 0, 1, 1, v2); viewer.addPointCloud(cloud_a, "original cloud", v1); viewer.addPointCloud(cloud3, "cloud", v2); viewer.setBackgroundColor(255, 255, 255); viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 0, 0, "original cloud"); viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 4, "original cloud"); viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 0, 0, "cloud"); viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 4, "cloud"); viewer.spin(); return 0; }详细解释一下这段代码,如有问题,请给出改进意见。
03-08
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值