首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何利用PCL进行色彩过滤

如何利用PCL进行色彩过滤
EN

Stack Overflow用户
提问于 2022-05-09 12:34:31
回答 2查看 201关注 0票数 1

我正在学习使用pcl.I,我想过滤掉颜色为红色的点云(rgb 255,0,0),但我不应该使用work.what吗?我使用的PCL版本是1.12.1。

代码语言:javascript
复制
#include <pcl/point_types.h>
#include <pcl/filters/conditional_removal.h>
int main()
{
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_filtered(new 
    pcl::PointCloud<pcl::PointXYZRGB>);

    cloud->width = 5;
    cloud->height = 1;
    cloud->points.resize((cloud->width) * (cloud->height));
    //creat point cloud
    for (size_t i = 0; i < cloud->points.size(); ++i)
    {
       cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f) / 1000;
       cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f) / 1000;
       cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f) / 1000;
       cloud->points[i].r = 110;
       cloud->points[i].g = 110;
       cloud->points[i].b = 110;
    }
   //set rbg 255,0,0
    cloud->points[2].r = 255;cloud->points[2].g = 0;cloud->points[2].b = 0;
    
    pcl::ConditionAnd<pcl::PointXYZRGB>::Ptr range_cond(new pcl::ConditionAnd<pcl::PointXYZRGB>());
    range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZRGB>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZRGB>("r", pcl::ComparisonOps::EQ, 255)));
    range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZRGB>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZRGB>("g", pcl::ComparisonOps::EQ, 0)));
    range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZRGB>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZRGB>("b", pcl::ComparisonOps::EQ, 0)));
   
   pcl::ConditionalRemoval<pcl::PointXYZRGB> condrem;
   condrem.setCondition(range_cond);
   condrem.setInputCloud(cloud);
   condrem.setKeepOrganized(true);
   condrem.filter(*cloud_filtered);
   
   std::cerr << "Cloud before filtering: " << std::endl;
   for (size_t i = 0; i < cloud->points.size(); ++i)
       std::cerr << "    " << cloud->points[i].x << " "
       << cloud->points[i].y << " "
       << cloud->points[i].z << " "
       << (int)cloud->points[i].r << " "
       << (int)cloud->points[i].g << " "
       << (int)cloud->points[i].b << std::endl;

   std::cerr << "Cloud after filtering: " << std::endl;
   for (size_t i = 0; i < cloud_filtered->points.size(); ++i)
      std::cerr << "    " << cloud_filtered->points[i].x << " "
      << cloud_filtered->points[i].y << " "
      << cloud_filtered->points[i].z << " "
      << (int)cloud_filtered->points[i].r << " "
      << (int)cloud_filtered->points[i].g << " "
      << (int)cloud_filtered->points[i].b << std::endl;
   return (0);

}

过滤后的云是零。结果:在这里输入图像描述

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-09 16:06:39

警告信息给您一个提示:“字段未找到!”(三次)。PointXYZRGB没有rgb字段。您可以使用getFields()来找出点类型有哪些字段。PointXYZRGB有一个组合字段rgb,您可以使用它进行筛选。但是,您可能需要考虑使用PointXYZRGBA (与字段rgba一起),因为另一个点类型使用float进行存储(历史原因),我不确定这与过滤的效果有多好。

票数 1
EN

Stack Overflow用户

发布于 2022-05-10 02:29:26

我修改的代码在这里:

代码语言:javascript
复制
//creat point cloud
for (size_t i = 0; i < cloud->points.size(); ++i)
{
   cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f) / 1000;
   cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f) / 1000;
   cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f) / 1000;
   cstd::uint32_t rgb = ((std::uint32_t)110 << 16 | (std::uint32_t)110 << 8 | (std::uint32_t)110);
   cloud->points[i].rgb = *reinterpret_cast<float*>(&rgb);
}
//set red rbg 255,0,0
std::uint32_t red_rgb = ((std::uint32_t)255 << 16 | (std::uint32_t)0 << 8 | (std::uint32_t)0);
cloud->points[2].rgb = *reinterpret_cast<float*>(&red_rgb);
std::cerr << " FieldsList:" << pcl::getFieldsList(*cloud) <<std::endl;

pcl::ConditionAnd<pcl::PointXYZRGB>::Ptr range_cond(new pcl::ConditionAnd<pcl::PointXYZRGB>());
std::uint32_t rgb_filter = ((std::uint32_t)255 << 16 | (std::uint32_t)0 << 8 | (std::uint32_t)0);

//Add a comparison operator less than (255,0,0) on the rgb field
range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZRGB>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZRGB>("rgb", pcl::ComparisonOps::LT, *reinterpret_cast<float*>(&rgb_filter))));

最终结果:在这里输入图像描述

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72172104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档