在看代码的过程中经常会忽略一些小东西,但突然用的时候可能找不到,在这里记下,以备不时之需。之后在这里一点点补充吧。【OK】
原谅我表情包太多,就想贴两张,愉悦身心。【微笑】
目录
- 计算时间
- 加载点云
- 保存pcd文件
- 点云可视化
- 点云拼接
- 随机填充出一个点云
- 命令行显示提示
- 获取点云头部
- 实现类似pcl::PointCloud::Ptr和pcl::PointCloud的两个类相互转换
计算时间
代码中很多时候需要计算时间,我觉得一方面是需要在命令行显示出来,一方面可以用来衡量算法的性能。
#include <pcl/console/time.h>
pcl::console::TicToc timer;
timer.tic();
//do something
std::cout << time.toc() << std::endl;
加载点云
直接读取
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile ("***.pcd", *cloud);
pcl::PCDReader reader;
reader.read ("table_scene_mug_stereo_textured.pcd", *cloud);
命令行读取,命令行读取会方便一些,成功生成解决方案后,可以在命令行对不同的点云文件进行处理,用上述的话换个点云就得重运行一次。
int
main(int argc, char** argv)
{
std::string filename = argv[1];
std::cout << "Reading " << filename << std::endl;
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>(filename, *cloud) == -1) // load the file
{
PCL_ERROR("Couldn't read file");
return -1;
}
std::cout << "points: " << cloud->points.size() << std::endl;
return 0;
}
保存pcd文件
#include <pcl/io/pcd_io.h>
pcl::io::savePCDFileASCII ("test_pcd.pcd", cloud);//保存成ascll码形式
std::cerr << "Saved " << cloud.points.size () << " data points to test_pcd.pcd." << std::endl;//命令行显示点云的数量
for (size_t i = 0; i < cloud.points.size (); ++i)
std::cerr << " " << cloud.points[i].x << " " << cloud.points[i].y << " " << cloud.points[i].z << std::endl;//命令行显示所有的点的坐标
#include <pcl/io/pcd_io.h>
pcl::PCDWriter writer;
writer.write<pcl::PointXYZ> ("table_scene_lms400_downsampled.pcd", *cloud_filtered, false);
可视化
窗口经常用来显示点云处理后的结果,经常需要显示不同的样子,之前总结过一次,详见笔记链接。
https://blog.csdn.net/yamgyutou/article/details/105123955
viewer.addText("White: Original point cloud\nGreen: Matrix transformed point cloud", 10, 15, 16, 0.2, 0.3, 0.4 "icp_info_1", v1);
在可视化窗口显示文字。参数1---要显示的内容;参数2/3--- 文本在屏幕的xy位置;参数4---文本字体大小;参数5/6/7---文本rgb颜色;参数8---ID;参数9---显示的窗口。
点云拼接
连接连个点云,直接相加
cloud_c=cloud_a;
cloud_c +=cloud_b;
连接连个点云文件,将a/b文件拼接存成c
pcl::concatenateFields (cloud_a, cloud_b, cloud_c);
随机填充点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
cloud->width = 5000; //填充点云数据
cloud->height = 1; //1 代表无序点云
cloud->is_dense = false; //如果没有点是无效的,则为true
cloud->points.resize (cloud->width * cloud->height);
for (size_t i = 0; i < cloud->points.size (); ++i)
{
cloud->points[i].x = rand () / (RAND_MAX + 1.0);
cloud->points[i].y = rand () / (RAND_MAX + 1.0);
cloud->points[i].z = rand () / (RAND_MAX + 1.0);
}
命令行显示提示
之前在命令行显示一句话,都用cout,这是c++本就有的语法。
std::cout<<"Starting alignment...\n"<<std::endl;
还可以:
pcl::console::print_highlight ("Starting alignment...\n");
获取点云头部,包括点云里点的格式
譬如是pcl::PointXYZ还是pcl::PointXYZRGB等类型
参考:http://www.manongjc.com/article/93751.html
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/PCLPointCloud2.h>
pcl::PCLPointCloud2 cloud;
pcl::PCDReader reader;
reader.readHeader("C:\fandisk.pcd", cloud);
for (int i = 0; i < cloud.fields.size(); i++)
{
std::cout << cloud.fields[i].name;
}
实现类似pcl::PointCloud::Ptr和pcl::PointCloud的两个类相互转换
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudPointer(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ> cloud;
cloud = *cloudPointer;
cloudPointer = cloud.makeShared();