PCL常见错误集合
PCL错误4996:项目属性页>C/C++>常规>SDL检查(设置为否)
C:\Program Files\PCL 1.8.1\3rdParty\FLANN\include\flann\algorithms\dist:修改将503行的“typedef unsigned long long pop_t;”移到前面的“#if GNUC”这一行前面就可以了。
原位置503/504
点云的基本类型:
pcl::PointCloud<pcl::PointXYZ>
pcl::PointCloud<pcl::PointXYZI>
pcl::PointCloud<pcl::PointXYZRGBA>
第二种类型包含点的强度信息,也就是激光的反射率.第一种没有,只有xyz坐标信息.所以用第二种可以将点云保存成带点的强度的PCD文件,或者订阅ROS点云消息后转化为带强度的普通点云类型。
一般以find开头的函数是查询,以set开头的函数是设置,以is开头的函数是判断,以get开头的函数是获取,以start开头的函数是启动,以stop开头的函数是停止,以register开头的函数是注册,以unregister开头的函数是注销,以load开头的函数是打开,以save开头的函数是保存,以delete的函数开头是删除,以switch的函数开头是交换,尾缀Supported代表是否支持,尾椎Callback代表是否回调函数,
#include <pcl/io/openni2_grabber.h>
pcl::Grabber* interface = new pcl::io::OpenNI2Grabber();
OpenNI2并不和OpenNI向下兼容,如需使用OpenNI开发以前的产品,需要同时安装OpenNI。
PCL_EXPORTS int pcl::console::parse_argument ( int argc,
char ** argv,
const char * str,
char & val
)
///解析具有给定扩展名的文件名的命令行参数。
在输入地址时,最好输入绝对路径,相对路径经常报错。
在代码中输入地址时用双斜线,单斜线会引起歧义。
PCL中有许多类函数来自其父类,如果在说明中找不到可以到其父类的说明中去寻找。
#include <boost/make_shared.hpp> //boost指针相关头文件
#include <pcl/point_types.h> //点类型定义头文件
#include <pcl/point_cloud.h> //点云类定义头文件
#include <pcl/point_representation.h> //点表示相关的头文件
#include <pcl/io/pcd_io.h> //PCD文件打开存储类头文件
#include <pcl/filters/voxel_grid.h> //用于体素网格化的滤波类头文件
#include <pcl/filters/filter.h> //滤波相关头文件
#include <pcl/features/normal_3d.h> //法线特征头文件
#include <pcl/registration/icp.h> //ICP类相关头文件
#include <pcl/registration/icp_nl.h> //非线性ICP 相关头文件
#include <pcl/registration/transforms.h> //变换矩阵类头文件
#include <iostream>//标准C++库中输入输出文件类相关头文件
#include <boost/thread/thread.hpp>//线程处理头文件
#include <pcl/common/common_headers.h>//一次输入common整个文件夹头文件的头文件
#include <pcl/range_image/range_image.h>//深度图像头文件
#include <pcl/visualization/range_image_visualizer.h>//深度图像可视化头文件
#include <pcl/visualization/pcl_visualizer.h>//PCLVisualizer可视化类头文件
#include <pcl/console/parse.h>//命令行解析头文件
#include <pcl/features/fpfh.h>//FPFH快速点特征直方图头文件
#include <pcl/sample_consensus/method_types.h>//随机参数估计方法头文件
#include <pcl/sample_consensus/model_types.h>//模型定义头文件
#include <pcl/segmentation/sac_segmentation.h>//基于采样一致性分割的类的头文件
#include <pcl/filters/crop_hull.h>//CropHull滤波器类头文件
#include <pcl/surface/concave_hull.h>创建凹多边形类定义头文件
#include <pcl/range_image/range_image.h>//深度图像类头文件
#include <pcl/features/integral_image_normal.h>//法线估计类头文件
#include <pcl/kdtree/kdtree_flann.h>//kdtree类定义头文件
#include <boost/make_shared.hpp> //boost指针相关头文件
#include <pcl/point_types.h> //点类型定义头文件
#include <pcl/point_cloud.h> //点云类定义头文件
#include <pcl/features/normal_3d.h> //法线特征头文件
#include <pcl/features/normal_3d_omp.h> //法线特征加速头文件
#include <pcl/features/fpfh.h> //fpfh类特征头文件
#include <pcl/features/fpfh_omp.h> //fpfh加速类头文件
#include <pcl/features/boundary.h> //边界提取头文件
#include <pcl/search/kdtree.h> //kdtree搜索对象类头文件
#include <pcl/point_representation.h> //点表示相关的头文件
#include <pcl/io/pcd_io.h> //PCD文件打开存储类头文件
#include <pcl/filters/passthrough.h> //直通滤波器头文件
#include <pcl/filters/voxel_grid.h> //用于体素网格化的滤波类头文件
#include <pcl/filters/filter.h> //滤波相关头文件
#include <pcl/filters/project_inliers.h> //点云投影头文件
#include <pcl/filters/extract_indices.h> //索引提取头文件
#include <pcl/filters/statistical_outlier_removal.h> //统计离群点类头文件
#include <pcl/segmentation/sac_segmentation.h> //RanSaC分割
#include <pcl/segmentation/region_growing.h> //区域生长
#include <pcl/segmentation/region_growing_rgb.h> //基于颜色的区域生长
#include <pcl/segmentation/supervoxel_clustering.h> //超体聚类
#include <pcl/segmentation/lccp_segmentation.h> //基于凹凸性分割
#include <pcl/surface/mls.h> //点云平滑类头文件
#include <pcl/registration/icp.h> //ICP类相关头文件
#include <pcl/registration/icp_nl.h> //非线性ICP 相关头文件
#include <pcl/registration/transforms.h> //变换矩阵类头文件
#include <pcl/registration/ia_ransac.h> //sac-ia类头文件
#include <pcl/registration/correspondence_estimation.h> //直方图配准
#include <pcl/registration/correspondence_rejection_features.h>//特征的错误对应关系去除
#include <pcl/registration/correspondence_rejection_sample_consensus.h>//随机采样一致性去除
#include <pcl/ModelCoefficients.h>//模型参数头文件
#include <pcl/sample_consensus/method_types.h>//随机参数估计方法头文件
#include <pcl/sample_consensus/model_types.h>//模型定义头文件
#include <deque> //STL 双端队列容器
#include <exception> //异常处理类
#include <fstream> //文件输入/输出
#include <functional> //STL 定义运算函数(代替运算符)
#include <limits> //定义各种数据类型最值常量
#include <list> //STL 线性列表容器
#include <map> //STL 映射容器
#include <iomanip> //参数化输入/输出
#include <ios> //基本输入/输出支持
#include <sstream> //基于字符串的流
#include <stack> //STL 堆栈容器
#include <algorithm> //STL 通用算法
#include <bitset> //STL 位集容器
#include <cctype> //字符处理
#include <stdexcept> //标准异常类
#include <streambuf> //底层输入/输出支持
#include <string> //字符串类
#include <utility> //STL 通用模板类
#include <vector> //STL 动态数组容器
#include <iosfwd> //输入/输出系统使用的前置声明
#include <cerrno> //定义错误码
#include <clocale> //定义本地化函数
#include <cmath> //定义数学函数
#include <complex> //复数类
#include <cstdio> //定义输入/输出函数
#include <cstdlib> //定义杂项函数及内存分配函数
#include <cstring> //字符串处理
#include <ctime> //定义关于时间的函数
#include <iostream> //数据流输入/输出
#include <istream> //基本输入流
#include <ostream> //基本输出流
#include <queue> //STL 队列容器
#include <set> //STL 集合容器
#include <cwchar> //宽字符处理及输入/输出
#include <cwctype> //宽字符分类
#include <complex.h> //复数处理
#include <fenv.h> //浮点环境
#include <inttypes.h> //整数格式转换
#include <stdbool.h> //布尔环境
#include <stdint.h> //整型环境
#include <tgmath.h> //通用类型数学宏
C:\Program Files\PCL 1.8.1\3rdParty\Boost\include\boost-1_64\boost\typeof\msvc\typeof_impl.hpp错误
在项目源文件的顶部加上#define BOOST_TYPEOF_EMULATION
Microsoft.Cpp.x64.user项目属性表因该是VS自动添加的,由于同时添加Debug和Release情况下的属性表,会在Debug模式下引起异常。
5.2.1简单点云可视化中圆球麦子点云运行会出现如下错误:
Generic Warning: In C:\Build\3rdPartyx6 4\VTK 8.0.0\Rendering\CorelyvtkPolyDataMapper.cxx, line 28
Error: no override found for ‘vtkPolyDataMapper’.
解决方法参考网站:https://www.it610.com/article/1290633330752036864.htm
在所有代码的最前面加如下代码块:
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);
错误:未识别标识符sleep
pcl_macros.h文件中将18行的pcl_sleep(x) d=的宏定义sleep(x) 改为Sleep(x)
Assertion failed: px != 0, file c:\program files\pcl 1.8.1\3rdparty\boost\include\boost-1_64\boost\smart_ptr\shared_ptr.hpp, line 711
在子函数中不用boost::shared_ptr,而是直接使用变量试一下。
PCL_VISUALIZER_POINT_SIZE和PCL_VISUALIZER_FONT_SIZE不同。
通过命令行来读取文件的代码:
if (argc < 2)
{
std::cout << "please input \".exe source.pcd \" . " << std::endl;
return (0);
}
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);//实例化一个点云对象来存储点云文件
if (pcl::io::loadPCDFile(argv[1] ,*cloud) == -1)//打开输入的pcd文件
{
std::cout << "Was not able to open file \"" << argv[1] << std::endl;
return (0);
}//打不开时报错
pcl_isfinite函数返回一个布尔值,检查某个值是不是正常数值。用于去除无效点。
double
computeCloudResolution(const pcl::PointCloud<PointType>::ConstPtr &cloud)//计算点云分辨率的函数
{
double res = 0.0;
int n_points = 0;
int nres;
std::vector<int> indices(2);//保存搜索完的邻域点对应的索引
std::vector<float> sqr_distances(2);//保存搜索完的每个邻域点与查询点之间的欧氏距离
pcl::search::KdTree<PointType> tree;//创建一个kd tree对象
tree.setInputCloud(cloud);//向kd tree中传入点云
for (size_t i = 0; i < cloud->size(); ++i)//遍历整个点云
{
if (!pcl_isfinite((*cloud)[i].x))
{
continue;
}//如果遇到无效点,跳过
nres = tree.nearestKSearch(i, 2, indices, sqr_distances);//对索引为i的点进行K邻域搜索,考虑第二个邻域点,因为第一个邻域点就是点本身。
if (nres == 2)
{
res += sqrt(sqr_distances[1]);
++n_points;
}//如果在邻域内只找到2个点,n_points+1,并球所有满足此条件点的求欧式距离之和
}
if (n_points != 0)
{
res /= n_points;
}//如果n_points,计算点云分辨率
return res;//返回点云分辨率值
}
在法线估计等特征提取操作前进行下采样很重要,会极大地影响特征的提取速度。有序点云积分图法估计速度快于无序点云。
viewer.setCameraPosition(pos_vector[0], pos_vector[1], pos_vector[2], look_at_vector[0],
look_at_vector[1], look_at_vector[2], up_vector[0], up_vector[1], up_vector[2]);
viewer.updateCamera();
/*viewer.camera_.pos[0] = pos_vector[0];
viewer.camera_.pos[1] = pos_vector[1];
viewer.camera_.pos[2] = pos_vector[2];
viewer.camera_.focal[0] = look_at_vector[0];
viewer.camera_.focal[1] = look_at_vector[1];
viewer.camera_.focal[2] = look_at_vector[2];
viewer.camera_.view[0] = up_vector[0];
viewer.camera_.view[1] = up_vector[1];
viewer.camera_.view[2] = up_vector[2];
viewer.updateCamera();*/
//uniform_sampling.compute(sampled_indices);
//pcl::copyPointCloud(*model, sampled_indices.points, *model_keypoints);
uniform_sampling.filter(*model_keypoints);//计算并输出模型点云经过下采样得到的点云,存储到model_keypoints。
C1128节数超过对象文件格式限制:请使用/bigobj进行编译:单击“C/C++”项,单击“命令行”属性页,在“附加选项”框中键入编译器选项,添加/bigobj。
由于找不到flann.dll,无法继续执行代码。重新安装程序可能会解决此问题。
解决方案:
将PCL1.8.1\3rdParty\FLANN\bin文件里的flann.dill复制到PCL1.8.1\bin文件夹下即可
错误 LNK2005 qh_makeridges 已经在 qhull_d.lib(qhull_d.dll) 中定义 用release,而不用debug。
没有viewer.spinOnce ();,可视化窗口会在打开后直接卡死。
sensor_msgs::PointCloud2修改为pcl::PCLPointCloud2
error C2039: “fromROSMsg”: 不是“pcl”的成员:pcl::fromROSMsg修改为pcl::fromPCLPointCloud2
‘pcl::SAC_SAMPLE_SIZE’: This map is deprecated and is kept only to prevent breaking existing user code. Starting from PCL 1.8.0 model sample size is a protected member of the SampleConsensusModel class
可能只是警告,问题出在typeof_impl.hpp错误。
严重性 代码 说明 项目 文件 行 禁止显示状态
错误(活动) E1097 未知特性 “no_init_all” Test_83 C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\winnt.h 3901
切换Windows Kits版本即可
读取或保存文件时抛出异常:检查点云形状,点云是否为空点云。