前言
随着工业自动化、智能化的不断推进,机器视觉(2D/3D)在工业领域的应用和重要程度也同步激增(识别、定位、抓取、测量,缺陷检测等),而针对不同作业场景进行解决方案设计时,通常会借助PCL、OpenCV、Eigen等简单方便的开源算法库进行方案的快速验证和迭代以满足作业场景下的目标需求。
为了让对工业机器视觉方向感兴趣的同学能够少走一些弯路,故推出了此一系列简易入门教程示例,让初次使用者能够最简单直观地感受到当前所用算法模块的执行效果。
后续会逐步扩增与工业机器视觉相关的一些其它内容,如:
项目案例剖析、场景数据分析、基础算法模块、相机评测 等;
如有兴趣可加入群聊(若入群二维码被屏蔽,则可以通过Q群(1032861997)或评论、私信博主“群聊”,邀请入群),与同道同学及圈内同行一起交流讨论。
程序说明
加载并可视化obj模型纹理数据;
输出结果
代码示例
/*
* @File: load_obj.cpp
* @Brief: pcl course
* @Description: 加载并可视化obj模型纹理数据
* @Version: 0.0.1
* @Author: MuYv
*/
#include <iostream>
#include <string>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/obj_io.h>
#include <pcl/io/vtk_lib_io.h>
#include <pcl/visualization/pcl_visualizer.h>
int main(int argc, char** argv){
if(argc != 2){
std::cout<<"Usage: exec obj_file_path"<<std::endl;
return -1;
}
const std::string kObjFilePath = argv[1]; // ../clouds/cabinet/cabinet/mesh.obj
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_src(new pcl::PointCloud<pcl::PointXYZ>());
// 将obj格式数据加载为点云
// 成功返回0,失败返回-1
if(-1 == pcl::io::loadOBJFile(kObjFilePath,*cloud_src)){
std::cout<<"load obj file failed. please check it."<<std::endl;
return -2;
}
// 将obj格式数据加载为PolygonMesh对象
pcl::PolygonMesh poly_mesh;
// 成功返回0,失败返回-1
if(-1 == pcl::io::loadOBJFile(kObjFilePath, poly_mesh)){
std::cout<<"load obj file failed. please check it."<<std::endl;
return -2;
}
// 将obj格式数据加载为TextureMesh对象
pcl::TextureMesh texture_mesh, texture_mesh_tmp;
// 成功返回0,失败返回-1
if(-1 == pcl::io::loadPolygonFileOBJ(kObjFilePath, texture_mesh)){
std::cout<<"load obj file failed. please check it."<<std::endl;
return -2;
}
// 成功返回0,失败返回-1
if(-1 == pcl::io::loadOBJFile(kObjFilePath, texture_mesh_tmp)){
std::cout<<"load obj file failed. please check it."<<std::endl;
return -2;
}
texture_mesh.tex_materials = texture_mesh_tmp.tex_materials;
// 创建可视化对象
pcl::visualization::PCLVisualizer viewer("viewer");
// 将当前窗口,拆分成横向的2个可视化窗口,以viewport区分(v1/v2)
int v1;
int v2;
int v3;
//窗口参数分别对应 x_min, y_min, x_max, y_max, viewport
viewer.createViewPort(0.0, 0.0, 0.33, 1.0, v1);
viewer.createViewPort(0.33, 0.0, 0.66, 1.0, v2);
viewer.createViewPort(0.66, 0.0, 1.0, 1.0, v3);
// 添加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.addText("v3", 10,10, 20, 0,0,1, "viewport_v3", v3);
// 添加坐标系
viewer.addCoordinateSystem(0.5); // 单位:m
// 设置可视化窗口背景色
viewer.setBackgroundColor(0.2,0.2,0.2); // r,g,b 0~1之间
//按照z方向深度进行渲染(色带渐变)
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> color(cloud_src, "z");
// 向v1窗口中添加点云
viewer.addPointCloud(cloud_src,color,"cloud_src",v1);
// 根据点云id,设置点云可视化属性,此处将可视化窗口中的点大小调整为2级
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud_src");
// 向v2窗口中添加PolygonMesh对象
viewer.addPolygonMesh(poly_mesh, "mesh_src",v2);
// 向v3窗口中添加PolygonMesh对象
viewer.addTextureMesh(texture_mesh, "texture_mesh_src",v3);
// // 设置可视化窗口内的所有mesh为线框模式,部分情况下,便于可视化debug
// viewer.setRepresentationToWireframeForAllActors();
// 关闭窗口则退出
while(!viewer.wasStopped()){
viewer.spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}
总结
obj模型常用作刚体工件模型数据的文本存储格式;
在基于pcl的接口进行可视化时,由于pcl算法库自身的问题,直接使用接口加载进来的无法正常展示为纹理模型,可按照上述代码中示例的方式进行;
注:部分测试所用点云数据来源于网络,如有侵权,请联系博主删除,谢谢。