前言
随着工业自动化、智能化的不断推进,机器视觉(2D/3D)在工业领域的应用和重要程度也同步激增(识别、定位、抓取、测量,缺陷检测等),而针对不同作业场景进行解决方案设计时,通常会借助PCL、OpenCV、Eigen等简单方便的开源算法库进行方案的快速验证和迭代以满足作业场景下的目标需求。
为了让对工业机器视觉方向感兴趣的同学能够少走一些弯路,故推出了此一系列简易入门教程示例,让初次使用者能够最简单直观地感受到当前所用算法模块的执行效果。
后续会逐步扩增与工业机器视觉相关的一些其它内容,如:
项目案例剖析、场景数据分析、基础算法模块、相机评测 等;
如有兴趣可加入群聊(若入群二维码被屏蔽,则可以通过Q群(1032861997)或评论、私信博主“群聊”,邀请入群),与同道同学及圈内同行一起交流讨论。
程序说明
加载ply格式数据并作可视化展示(点云、mesh模型);
输出结果
代码示例
/*
* @File: load_ply.cpp
* @Brief: pcl course
* @Description: 展示ply格式数据的加载和可视化效果
* @Version: 0.0.1
* @Author: MuYv
*/
#include <iostream>
#include <string>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/ply_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 kPlyFilePath = argv[1]; // ../clouds/room/room_scannet_mesh.ply
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_src(new pcl::PointCloud<pcl::PointXYZRGB>());
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_tmp(new pcl::PointCloud<pcl::PointXYZ>());
// 将ply格式数据加载为点云
// 成功返回0,失败返回-1
if(-1 == pcl::io::loadPLYFile(kPlyFilePath,*cloud_src)){
std::cout<<"load ply file failed. please check it."<<std::endl;
return -2;
}
// 将ply格式数据加载为PolygonMesh对象
pcl::PolygonMesh poly_mesh;
// 成功返回0,失败返回-1
if(-1 == pcl::io::loadPLYFile(kPlyFilePath, poly_mesh)){
std::cout<<"load ply file failed. please check it."<<std::endl;
return -2;
}
// 创建可视化对象
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.5); // 单位:m
// 设置可视化窗口背景色
viewer.setBackgroundColor(0.2,0.2,0.2); // r,g,b 0~1之间
// 向v1窗口中添加点云
viewer.addPointCloud(cloud_src,"cloud_src",v1);
// 向v2窗口中添加PolygonMesh对象
viewer.addPolygonMesh(poly_mesh, "mesh_src",v2);
// // 设置可视化窗口内的所有mesh为线框模式,部分情况下,便于可视化debug
// viewer.setRepresentationToWireframeForAllActors();
// 关闭窗口则退出
while(!viewer.wasStopped()){
viewer.spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}
总结
ply格式也常用于点云数据的存储,自动化流程加载中,要主要传入数据的具体数据内容;
在定位抓取项目中,所提供的刚体工件模型,可能是ply/obj/stl格式的mesh模型文件;
注:部分测试所用点云数据来源于网络,如有侵权,请联系博主删除,谢谢。