pcl点云处理有 concatenateFields 可以用来串联法线数据,从而将 x-y-z格式数据变成 x-y-z-nx-ny-nz格式数据。
显示效果如下:

估计法线,然后串联法线。有法线的点云,就有阴影显示效果

右侧是添加了法线的显示的点云
扩展klib的插件代码如下:
struct OpCldConcatNormal
{
PointCloudNormalPtr normPtr;
KArbit operator()(const PointCloudXYZIPtr& cld)
{
auto cld2 = pcl::make_shared<PointCloudXYZINormal>();
pcl::concatenateFields(*cld, *normPtr, *cld2);
return cld2;
}
KArbit operator()(const PointCloudXYZPtr& cld)
{
auto cld2 = pcl::make_shared<PointCloudXYZNormal>();
pcl::concatenateFields(*cld, *normPtr, *cld2);
return cld2;
}
KArbit operator()(const PointCloudXYZRGBPtr& cld)
{
auto cld2 = pcl::make_shared<PointCloudXYZRGBNormal>();
pcl::concatenateFields(*cld, *normPtr, *cld2);
return cld2;
}
KArbit operator()(const PointCloudXYZLPtr& cld)
{
auto cld2 = pcl::make_shared<PointCloudXYZLNormal>();
pcl::concatenateFields(*cld, *normPtr, *cld2);
return cld2;
}
};
inline KArbit cld_op(const KArbit& cld, OpCldConcatNormal& p)
{
if (auto d = a2T<PointCloudXYZPtr>(&cld)) return p(*d);
if (auto d = a2T<PointCloudXYZIPtr>(&cld)) return p(*d);
if (auto d = a2T<PointCloudXYZRGBPtr>(&cld)) return p(*d);
if (auto d = a2T<PointCloudXYZLPtr>(&cld)) return p(*d);
return KArbit();
}
struct KPclOpCldConcatNormal : KPlugBase
{
OpCldConcatNormal p;
int __exec(const KArbit& src, KArbit& dst) override
{
auto& aL = a2list(src);
p.normPtr = aL[1];
dst = cld_op(aL[0], p);
return true;
}
};
文章介绍了如何利用PCL库中的concatenateFields函数将点云数据与法线数据结合,以实现从x-y-z格式转换为x-y-z-nx-ny-nz格式,从而在点云显示中加入阴影效果。提供的代码示例展示了如何扩展Klib插件来处理不同类型的点云数据。
739

被折叠的 条评论
为什么被折叠?



