利用PCL,给.xyz格式的三维点云 根据每个点的分类加入彩色颜色数据

// C++ 标准库
#include <iostream>
#include <string>
using namespace std;


// OpenCV 库
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>


// PCL 库
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>


#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>


// 定义点云类型
typedef pcl::PointXYZRGB PointT;
typedef pcl::PointCloud<PointT> PointCloud;


// 主函数 
int main(int argc, char** argv)
{
ifstream outZ;
string aaZ = "C:/Users/du/Desktop/99.xyz";//三维点云坐标文件
outZ.open(aaZ);
vector<double>vn;//①每次更改pointN的值
const int pointN = 53490;
for (int i = 0; i <pointN; i++)
{
double b1;
outZ >> b1; vn.push_back(b1);
double b2;
outZ >> b2; vn.push_back(b2);
double b3;
outZ >> b3; vn.push_back(b3);
}
outZ.close();
//....................................
ifstream outZ22; //
string aaZ22 = "C:/Users/du/Desktop/99-res.txt";//每个点的分类,共53490行,每一行是一个数字(代表分类号)
outZ22.open(aaZ22);
vector<int>segments;
for (int i = 0; i <pointN; i++)
{
int b1;
outZ22 >> b1; segments.push_back(b1);
}
outZ22.close();
//....................................
PointCloud::Ptr cloud(new PointCloud);
// 遍历,加入颜色


int i = 0;
for (int j = 0; j < vn.size(); j += 3)
{

PointT p;

p.x = vn[j];
p.y = vn[j + 1];
p.z = vn[j + 2];
if (segments[i] == 0)//黑
{
p.r = 0;
p.g = 0;
p.b = 0;
}


if (segments[i] == 1)//黄
{
p.r = 255;
p.g = 255;
p.b = 0;
}
if (segments[i] == 2)//红
{
p.r = 255;
p.g = 0;
p.b = 0;
}
if (segments[i] == 3)//棕色
{
p.r = 205;
p.g = 133;
p.b = 63;
}


if (segments[i] == 4)//绿
{
p.r = 0;
p.g = 255;
p.b = 0;
}
if (segments[i] == 5)//紫
{
p.r = 128;
p.g = 0;
p.b = 128;
}
if (segments[i] == 6)//粉(品红)
{
p.r = 255;
p.g = 0;
p.b = 255;
}




if (segments[i] == 7)//天蓝
{
p.r = 135;
p.g = 206;
p.b = 250;
}
if (segments[i] == 8)//蓝
{
p.r = 0;
p.g = 0;
p.b = 255;
}

if (segments[i] == 9)//橙
{
p.r = 255;
p.g = 165;
p.b = 0;
}
i++;
cloud->points.push_back(p);
}
// 设置并保存点云
cloud->height = 1;
cloud->width = cloud->points.size();
cloud->is_dense = false;//最终优化结果:
pcl::io::savePCDFile("C:\\Users\\du\\Desktop\\99-colored.pcd", *cloud);
// 清除数据并退出
cloud->points.clear();


///
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
viewer->setBackgroundColor(150, 150, 150);
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud33(new pcl::PointCloud<pcl::PointXYZRGB>);
//pcl::io::loadPCDFile("myPCD/ICPmerge3-in-out-icp22.pcd", *cloud33); //加载点云文件
pcl::io::loadPCDFile("C:\\Users\\du\\Desktop\\99-colored.pcd", *cloud33); //加载点云文件


pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud33);
viewer->addPointCloud<pcl::PointXYZRGB>(cloud33, rgb, "sample cloud33");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud33");
viewer->addCoordinateSystem(1.0);
viewer->initCameraParameters();
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}

return 0;
}
  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值