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;
}
};