一、简介
心心念念的点云终于可以学了,之前两个月一直在忙项目,哎,年近三旬要从互联网转入工业视觉,对于当初的选择无怨无悔吧,跟着这位大佬来学吧PCL 读取、保存点云_点云侠的博客-CSDN博客_pcl保存点云PCL 读取、保存点云PCLPointCloud2和PointCloud点云的代码实现,以及PCLPointCloud2和PointCloud之间的相互转换。https://blog.csdn.net/qq_36686437/article/details/122080773
二、读入和写出点云的两种方式
#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>//pcd 读写类相关的头文件。
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>//PCL中支持的点类型头文件。
using std::cout;
int user_data;
#if 1
void viewerOneOff(pcl::visualization::PCLVisualizer& viewer)
{
viewer.setBackgroundColor(0.0, 0.5, 0.0);//设置背景颜色
}
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);//创建点云指针
if (-1 == pcl::io::loadPCDFile("bunny.pcd",*cloud))//放到与工程中的主.cpp同一位置的文件夹下
{
cout << "加载文件失败!" << endl;
return -1;
}
cout << cloud->points.size() << endl;
cout << "从点云数据中读取: " << (*cloud).width * (*cloud).height <<
"字节,数据中所包含的有效字段为: " << pcl::getFieldsList(*cloud) << endl;
cout << (*cloud).points.size() << endl;
pcl::visualization::CloudViewer viewer("First Cloud Viewer");
viewer.showCloud(cloud);//显示
viewer.runOnVisualizationThreadOnce(viewerOneOff);
std::cout << "PCL Test OK!\n";
system("pause");
}
# endif
#if 1
// 创建一个点云
int createFirstCloud()
{
pcl::PointCloud<pcl::PointXYZ> cloud;
cloud.width = 10000;
cloud.height = 1;
cloud.is_dense = false;
cloud.points.resize(cloud.width * cloud.height);
// 创建一个在0-1024 之间的正方体点云
for (size_t i = 0; i < cloud.size(); i++)
{
cloud.points[i].x = 1024 * (rand() / (RAND_MAX+1.0f));
cloud.points[i].y = 1024 * (rand() / (RAND_MAX + 1.0f));
cloud.points[i].z = 1024 * (rand() / (RAND_MAX + 1.0f));
}
pcl::io::savePCDFileASCII("myfirstcreatecloud.pcd",cloud);
return 0;
}
int main()
{
createFirstCloud();
pcl::PointCloud<pcl::PointXYZ> ::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>("myfirstcreatecloud.pcd",*cloud)==-1)
{
PCL_ERROR("this file is not found!!!");
return -1;
}
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("show my pountcloud "));
viewer->setBackgroundColor(0,0,0);
viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud");
// 显示
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}
# endif
#if 1
// 创建一个点云--椭圆
void createEllipsePointCloud(pcl::PointCloud<pcl::PointXYZRGB> ::Ptr &point_cloud_ptr)
{
uint8_t r(255), g(15), b(30);
for (float z(-1.0); z<=1.0; z+=0.01)
{
for (float angle(0.0); angle< 360.0; angle+=1)
{
pcl::PointXYZ ellipse_cloud;
ellipse_cloud.x = 0.1 * cosf(float(angle/180*M_PI));
ellipse_cloud.y = sinf(float(angle/180*M_PI));
ellipse_cloud.z = 1;
pcl::PointXYZRGB point;
point.x = ellipse_cloud.x;
point.y = ellipse_cloud.y;
point.z= ellipse_cloud.z;
uint32_t rgb = (static_cast<uint32_t>(r) << 16 | static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));
point.rgb = *reinterpret_cast<float*>(&rgb);
point_cloud_ptr->points.push_back(point);
}
if (z<0.0) {
r -= 12;
g += 12;
}
else
{
g -= 12;
b += 12;
}
point_cloud_ptr->width = (int)point_cloud_ptr->size();
point_cloud_ptr->height = 1;
}
}
void createCylinderpointcloud(pcl::PointCloud<pcl::PointXYZRGB>:: Ptr & cylinder_point_cloud)
{
uint8_t r(255), g(15), b(15);
for (float z = -1.0; z <= 1.0;z+=0.01)
{
for (float angle = 0.0; angle < 360; angle+=5.0)
{
pcl::PointXYZRGB point_cloud;
point_cloud.x = cosf(pcl::deg2rad(angle));
point_cloud.y = sinf(pcl::deg2rad(angle));
point_cloud.z = z;
uint32_t rgb = (static_cast<uint32_t>(r) << 16 | static_cast<uint32_t>(g) << 8 |
static_cast<uint32_t>(r));
point_cloud.rgb = *reinterpret_cast<float*>(&rgb);
cylinder_point_cloud->points.push_back(point_cloud);
}
if (z < 0.0) {
r -= 12;
g += 12;
}
else
{
g -= 12;
b += 12;
}
cylinder_point_cloud->width = (int)cylinder_point_cloud->points.size();
cylinder_point_cloud->height =1;
}
}
//构造球体点云
void creat_sphere_pointcloud(pcl::PointCloud<pcl::PointXYZRGB>::Ptr basic_cloud_ptr)
{
uint8_t r(255), g(15), b(15);
float radius = 2;
for (float angle1 = 0.0; angle1 <= 180.0; angle1 += 5.0)
{
for (float angle2 = 0.0; angle2 <= 360.0; angle2 += 5.0)
{
pcl::PointXYZRGB basic_point;
basic_point.x = radius * sinf(pcl::deg2rad(angle1)) * cosf(pcl::deg2rad(angle2));
basic_point.y = radius * sinf(pcl::deg2rad(angle1)) * sinf(pcl::deg2rad(angle2));
basic_point.z = radius * cosf(pcl::deg2rad(angle1));
uint32_t rgb = (static_cast<uint32_t>(r) << 16 |
static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));
basic_point.rgb = *reinterpret_cast<float*>(&rgb);
basic_cloud_ptr->points.push_back(basic_point);
}
if (radius != 0.0)
{
r -= 12;
g += 12;
}
else
{
g -= 12;
b += 12;
}
basic_cloud_ptr->width = (int)basic_cloud_ptr->points.size();
basic_cloud_ptr->height = 1;
}
}
int main(int argc, const char** argv) {
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
createEllipsePointCloud(cloud);
createCylinderpointcloud(cloud);
creat_sphere_pointcloud(cloud);
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);// 显示RGB
viewer->addPointCloud<pcl::PointXYZRGB>(cloud, "sample cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud"); // 设置点云大小
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}
# endif