PCL入门系列 —— PCLVisualizer可视化中窗口分割、点云着色、添加文本标签及坐标轴

工业机器视觉 2022-06-16 23:40:27

目录

  • 前言
  • 程序说明
  • 输出结果
  • 代码示例
  • 总结


前言

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

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

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

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

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


程序说明

展示pcl可视化类及窗口分割、点云着色、文本标签、设置点大小、添加坐标轴等功能效果;

输出结果

代码示例

/*
 * @File: visualization.cpp
 * @Brief: pcl course
 * @Description: 展示pcl可视化类的相关设置效果
 * @Version: 0.0.1
 * @Author: MuYv
 */
#include <iostream>
#include <string>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>



int main(int argc, char** argv){
    if(argc != 2){
        std::cout<<"Usage: exec cloud_file_path"<<std::endl;
        return -1;
    }
    const std::string kCloudFilePath = argv[1];     // ../clouds/cabinet_color_cloud.pcd

    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_src(new pcl::PointCloud<pcl::PointXYZRGB>());
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_tmp(new pcl::PointCloud<pcl::PointXYZ>());

    // 成功返回0,失败返回-1
    if(-1 == pcl::io::loadPCDFile(kCloudFilePath,*cloud_src)){
        std::cout<<"load pcd file failed. please check it."<<std::endl;
        return -2;
    }

    // 拷贝点云数据
    pcl::copyPointCloud(*cloud_src, *cloud_tmp);

    // 创建可视化对象
    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);

    // 添加3d文字标签
    pcl::PointXYZ pos_3d_text = {0.1,0.1,0.1};
    viewer.addText3D("3d_v1", pos_3d_text, 0.1, 1,0,0, "3d_text_v1", v1);
    viewer.addText3D("3d_v2", pos_3d_text, 0.1, 0,1,0, "3d_text_v2", v2);

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

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

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

    // // 设置单一颜色
    // pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color(cloud_tmp, 255, 0, 0);
    
    //按照z方向深度进行渲染(色带渐变)
    pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> color(cloud_tmp, "z");
    
    // // 设置随机颜色(整体)
    // pcl::visualization::PointCloudColorHandlerRandom<pcl::PointXYZ> color(cloud_tmp);

    // 向v2窗口中添加点云
    viewer.addPointCloud(cloud_tmp,color,"cloud_tmp",v2);
    // 根据点云id,设置点云可视化属性,此处将可视化窗口中的点大小调整为2级
    viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud_tmp");

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

    return 0;
}

总结

可视化类常用于开发时,对流程中点云数据的debug分析以及最终算法输出结果的简单验证;
点云着色、坐标系、点尺寸大小、2d文本标签、3d文本标签及多窗口分割等,都是常用的功能属性;


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

...全文
121 回复 打赏 收藏 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
发帖
机器视觉

4328

社区成员

图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
帖子事件
创建了帖子
2022-06-16 23:40
社区公告
暂无公告