前言
随着工业自动化、智能化的不断推进,机器视觉(2D/3D)在工业领域的应用和重要程度也同步激增(识别、定位、抓取、测量,缺陷检测等),而针对不同作业场景进行解决方案设计时,通常会借助PCL、OpenCV、Eigen等简单方便的开源算法库进行方案的快速验证和迭代以满足作业场景下的目标需求。
为了让对工业机器视觉方向感兴趣的同学能够少走一些弯路,故推出了此一系列简易入门教程示例,让初次使用者能够最简单直观地感受到当前所用算法模块的执行效果。
后续会逐步扩增与工业机器视觉相关的一些其它内容,如:
项目案例剖析、场景数据分析、基础算法模块、相机评测 等;
如有兴趣可加入群聊(若入群二维码被屏蔽,则可以通过Q群(1032861997)或评论、私信博主“群聊”,邀请入群),与同道同学及圈内同行一起交流讨论。
程序说明
展示常用点云数据的类型及相关属性;
输出结果
代码示例
/*
* @File: point_types.cpp
* @Brief: pcl course
* @Description: 展示常用点云数据的类型及相关属性
* @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>
int main(int argc, char** argv){
// 列出常用的几种点数据格式
// 常用于存储纯点云数据
pcl::PointXYZ pt; // x, y, z
// 常用于存储纯带颜色的点云数据
pcl::PointXYZRGB pt_rgb; // x, y, z, r, g, b
// 常用于存储带法向的点云
pcl::PointNormal pt_normal; // x, y, z, normal_x, normal_y, normal_z, curvature
// 常用于存储带强度信息的点云(如灰度图点云)
pcl::PointXYZI pt_intensity; // x, y, z, intensity
// 常用于存储法线估计结果
pcl::Normal normal; // normal_x, normal_y, normal_z, curvature
// 点云模板类的智能指针对象
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());
// 也可进行先定义,后初始化
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2;
cloud2 = pcl::PointCloud<pcl::PointXYZ>::Ptr(new pcl::PointCloud<pcl::PointXYZ>());
// 填充点属性数值
pt.x = 1.0f;
pt.y = 1.0f;
pt.z = 1.0f;
// 预申请10个数据量大小的内存空间,但并非实际使用大小
cloud->reserve(10);
// 将点数据压入点云中,此处模拟压入三个点数据
cloud->push_back(pt);
pt.x += 2;
cloud->push_back(pt);
pt.y += 3;
cloud->push_back(pt);
// 点云模板类重载了输出运算符"<<", 可简单查看当前点云相关属性数据
std::cout<<"\ncloud info:\n"<<*cloud<<std::endl;
// 判断是否为稠密点云, 即是否含无效点nan(not a number);
std::cout<<"is dense: "<<((cloud->is_dense)?("true"):("false"))<<std::endl;
// 判断是否为有序点云, 即height属性值是否不为1;
std::cout<<"is organized: "<<((cloud->isOrganized())?("true"):("false"))<<std::endl;
// width height size
std::cout<<"cloud width x height: "<<cloud->width<<" x "<<cloud->height<<std::endl;
std::cout<<"cloud size: "<<cloud->size()<<std::endl;
// 遍历点云数据
const int kPointNum = cloud->size();
for(int idx=0; idx<kPointNum; ++idx){
const auto& pt = cloud->points[idx];
std::cout<<pt.x<<' '<<pt.y<<' '<<pt.z<<std::endl;
}
std::cout<<std::endl;
return 0;
}
总结
如果是对有序点云数据进行处理,要注意无效点数据,通常无效点的x,y,z属性数值以nan、inf、0等形式表现;
尤其是在对单点进行操作时(如邻域搜索等),要注意无效点的处理;
注:部分测试所用点云数据来源于网络,如有侵权,请联系博主删除,谢谢。