pcl_small thing 小知识

在看代码的过程中经常会忽略一些小东西,但突然用的时候可能找不到,在这里记下,以备不时之需。之后在这里一点点补充吧。【OK】

              

原谅我表情包太多,就想贴两张,愉悦身心。【微笑】


目录

  1. 计算时间
  2. 加载点云
  3. 保存pcd文件
  4. 点云可视化
  5. 点云拼接
  6. 随机填充出一个点云
  7. 命令行显示提示
  8. 获取点云头部
  9. 实现类似pcl::PointCloud::Ptr和pcl::PointCloud的两个类相互转换 
  10.  

计算时间

代码中很多时候需要计算时间,我觉得一方面是需要在命令行显示出来,一方面可以用来衡量算法的性能。

#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();

猜你喜欢

转载自blog.csdn.net/yamgyutou/article/details/105265536