栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

PCL入门系列 —— IntegralImageNormalEstimation 基于积分图的(有序)点云法线估计

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PCL入门系列 —— IntegralImageNormalEstimation 基于积分图的(有序)点云法线估计

PCL入门系列 —— IntegralImageNormalEstimation 基于积分图的(有序)点云法线估计
    • 前言
    • 程序说明
    • 输出结果
    • 代码示例
    • 总结


前言

随着工业自动化、智能化的不断推进,机器视觉(2D/3D)在工业领域的应用和重要程度也同步激增(识别、定位、抓取、测量,缺陷检测等),而针对不同作业场景进行解决方案设计时,通常会借助PCL、OpenCV、Eigen等简单方便的开源算法库进行方案的快速验证和迭代以满足作业场景下的目标需求。

为了让对工业机器视觉方向感兴趣的同学能够少走一些弯路,故推出了此一系列简易入门教程示例,让初次使用者能够最简单直观地感受到当前所用算法模块的执行效果。

后续会逐步扩增与工业机器视觉相关的一些其它内容,如:

项目案例剖析、场景数据分析、基础算法模块、相机评测 等;

如有兴趣可加入群聊(若入群二维码被屏蔽,则可以通过Q群(1032861997)或评论、私信博主“群聊”,邀请入群),与同道同学及圈内同行一起交流讨论。


程序说明

展示基于积分图的法线估计效果;

输出结果

代码示例
#include 
#include 
#include 
#include 
#include 
#include 
#include 



int main(int argc, char** argv){
    if(argc != 2){
        std::cout<<"Usage: exec cloud_file_path"<::Ptr cloud_src(new pcl::PointCloud());
    pcl::PointCloud::Ptr cloud_normals(new pcl::PointCloud());

    // 成功返回0,失败返回-1
    if(-1 == pcl::io::loadPCDFile(kCloudFilePath,*cloud_src)){
        std::cout<<"load pcd file failed. please check it."< ne;
    // 设置法线计算方法
    ne.setNormalEstimationMethod(ne.AVERAGE_3D_GRADIENT);
    ne.setMaxDepthChangeFactor(0.02f);
    ne.setNormalSmoothingSize(10.0f);
    // 传入待估计法线的点云数据,注意,需传入有序点云数据
    ne.setInputCloud(cloud_src);
    // 计算点云法线
    ne.compute(*cloud_normals);

    // 如有需要,可以通过concatenateFields函数将point和normal组合起来形成PointNormal点云数据
    pcl::PointCloud::Ptr cloud_with_normal(new pcl::PointCloud());
    pcl::concatenateFields(*cloud_src, *cloud_normals, *cloud_with_normal);

    // 创建可视化对象
    pcl::visualization::PCLVisualizer viewer("viewer");

    // 将当前窗口,拆分成横向的2个可视化窗口,以viewport区分(v1/v2)
    int v1; 
    int v2;
    //窗口参数分别对应 x_min, y_min, x_max, y_max, viewport
    viewer.createViewPort(0.0, 0.0, 0.5, 1.0, v1);  
    viewer.createViewPort(0.5, 0.0, 1.0, 1.0, v2);

    // 添加2d文字标签
    viewer.addText("v1", 10,10, 20, 1,0,0, "viewport_v1", v1);
    viewer.addText("v2", 10,10, 20, 0,1,0, "viewport_v2", v2);

    // 添加坐标系
    viewer.addCoordinateSystem(0.1);    // 单位:m

    // 设置可视化窗口背景色
    viewer.setBackgroundColor(0.2,0.2,0.2);     // r,g,b  0~1之间

    // 设置单一颜色
    pcl::visualization::PointCloudColorHandlerCustom color(cloud_src, 255, 0, 0);

    // 向所有窗口中添加点云
    viewer.addPointCloud(cloud_src,color,"cloud_src");

    // 向v2窗口中添加法线可视化
    viewer.addPointCloudNormals(cloud_src, cloud_normals, 20, 0.03, "cloud_normals", v2);

    // 关闭窗口则退出
    while(!viewer.wasStopped()){
        viewer.spinOnce(100);
        boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    }

    return 0;
}
总结

与基于邻域的法线估计方法NormalEstimation相比,基于积分图的方法IntegralImageNormalEstimation,在同一份数据情况下,相对会快一些,但需注意,基于积分图的方法只能输入有序点云;


注:部分测试所用点云数据来源于网络,如有侵权,请联系博主删除,谢谢。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/913452.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号