基于Rangenet Lib的自动驾驶LiDAR点云语义分割与可视化

这段代码是一个C++程序,用于处理来自KITTI数据集的激光雷达(LiDAR)扫描数据。程序主要实现以下功能:

1. **读取和解析命令行参数**:使用Boost库中的`program_options`模块来定义和解析命令行参数。这包括扫描文件路径、模型路径以及是否启用详细模式(verbose)。

2. **处理KITTI数据集中的LiDAR扫描数据**:程序遍历指定KITTI数据集目录中的LiDAR扫描数据(`.bin`格式)。这些数据包含了LiDAR扫描的点云信息。

3. **LiDAR数据的语义分割**:使用`rangenet_lib`库创建一个网络模型来进行语义分割。这个库用于为LiDAR点云数据提供语义标签,例如将点分类为车辆、行人、道路等。

4. **读取和处理每个扫描文件**:对每个扫描文件,程序读取点云数据,并使用创建的网络模型进行推理(infer),得到每个点的语义标签。

5. **转换点云数据**:获取转换后的点云数据和颜色掩膜(color mask),这些颜色表示不同的语义类别。

6. **保存语义分割结果**:将每个点的坐标和对应的颜色标签保存到文本文件中。这些文件用于可视化或进一步分析处理。

7. **可视化(可选)**:如果启用了详细模式(verbose),则使用OpenCV的可视化工具(`cv::viz`)来显示语义分割后的点云。

总的来说,这个程序的主要作用是处理KITTI数据集中的LiDAR点云数据,通过使用语义分割网络对每个点进行分类,然后将分类结果保存并(可选地)进行可视化展示。这对于自动驾驶、机器人导航等领域的研究和应用是非常有用的。

1. infer中的内容 

/* Copyright (c) 2019 lifeiya, Chongqing University.**  This file is part of advanced rangenet_lib.**/// opencv stuff
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/viz.hpp>// c++ stuff
#include <chrono>
#include <iomanip>  
#include <iostream>
#include <string>
#include <sstream>// net stuff
#include <selector.hpp>
namespace cl = rangenet::segmentation;// boost
#include <boost/program_options.hpp>
namespace po = boost::program_options;
#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;typedef std::tuple< u_char, u_char, u_char> color;int main(int argc, const char *argv[]) {// define optionsstd::string scan;std::string path;std::string backend = "tensorrt";// 如果verbose为true,则程序会输出更多的运行过程信息,如果为false,则只输出最基本的信息。bool verbose = false;std::ostringstream scanStream;std::string kitti_num = "10"; // Replace "01" with the actual value you wantstd::string base_path = "/home/fairlee/dataset/KITTI/sequences_kitti_00_21/" + kitti_num + "/velodyne/";std::string file_extension = ".bin";// Calculate the number of files in the directoryint N = std::distance(fs::directory_iterator(base_path), fs::directory_iterator{});for(int file_num = 1000; file_num < N; ++file_num) {// cout<<"正在处理-----"<<file_num<<"/"<< N <<"数据"<<endl;std::cout << std::left << "正在处理 " <<kitti_num<< " 数据集中的第: "<< file_num << " / "  << N << " 帧数据" << std::endl;// Parse optionstry {po::options_description desc{"Options"};desc.add_options()("help,h", "Help screen")("scan,s", po::value<std::string>(&scan),"LiDAR scan to infer. No Default")("path,p", po::value<std::string>(),"Directory to get the inference model from. No default")("verbose,v", po::bool_switch(),"Verbose mode. Calculates profile (time to run)");po::variables_map vm;po::store(parse_command_line(argc, argv, desc), vm);po::notify(vm);std::cout << std::setfill('=') << std::setw(80) << "" << std::endl;if (vm.count("help")) {std::cout << desc << std::endl;return 0;}std::ostringstream scanStream;scanStream << base_path << std::setfill('0') << std::setw(6) << file_num << file_extension;scan = scanStream.str();// make defaults count, parameter check, and printpath = "/home/fairlee/darknet53/";if (vm.count("verbose")) {verbose = vm["verbose"].as<bool>();std::cout << "verbose: " << verbose << std::endl;} else {std::cout << "verbose: " << verbose << ". Using default!" << std::endl;}std::cout << std::setfill('=') << std::setw(80) << "" << std::endl;} catch (const po::error &ex) {std::cerr << ex.what() << std::endl;return 1;}// create a networkstd::unique_ptr<cl::Net> net = cl::make_net(path, backend);// set verbositynet->verbosity(verbose);// predict each imagestd::cout << std::setfill('=') << std::setw(80) << "" << std::endl;std::cout << "Predicting image: " << scan << std::endl;// Open a scanstd::ifstream in(scan.c_str(), std::ios::binary);if (!in.is_open()) {std::cerr << "Could not open the scan!" << std::endl;return 1;}in.seekg(0, std::ios::end);uint32_t num_points = in.tellg() / (4 * sizeof(float));in.seekg(0, std::ios::beg);std::vector<float> values(4 * num_points);in.read((char*)&values[0], 4 * num_points * sizeof(float));// predictstd::vector<std::vector<float>> semantic_scan = net->infer(values, num_points);// get point cloudstd::vector<cv::Vec3f> points = net->getPoints(values, num_points);// get color maskstd::vector<cv::Vec3b> color_mask = net->getLabels(semantic_scan, num_points);// Create output filenamestd::ostringstream outfileNameStream;outfileNameStream << "/home/fairlee/dataset/KITTI/sequences_kitti_00_21/" << kitti_num << "/RangeNet_point/" << std::setfill('0') << std::setw(6) << file_num << ".txt";std::string outfileName = outfileNameStream.str();// Create an ofstream objectstd::ofstream outfile(outfileName);if (!outfile) {std::cerr << "Unable to open output file: " << outfileName << std::endl;return 1;}// Iterate through each point and corresponding colorfor (size_t i = 0; i < points.size(); ++i) {// Write the point coordinates and color to the fileoutfile << points[i][0] << " " << points[i][1] << " " << points[i][2];outfile << " " << static_cast<int>(color_mask[i][0]) << " " << static_cast<int>(color_mask[i][1]) << " " << static_cast<int>(color_mask[i][2]) << "\n";}// Close the fileoutfile.close();Create an ofstream object
//std::ofstream outfile("output.txt");Iterate through each point and corresponding color
//for (size_t i = 0; i < points.size(); ++i) {
//  // Write the point coordinates and color to the file
//  outfile << points[i][0] << " " << points[i][1] << " " << points[i][2];
//  outfile << " " << static_cast<int>(color_mask[i][0]) << " " << static_cast<int>(color_mask[i][1]) << " " << static_cast<int>(color_mask[i][2]) << "\n";
//}Close the file
//outfile.close();// print the outputif (verbose) {cv::viz::Viz3d window("semantic scan");cv::viz::WCloud cloudWidget(points, color_mask);while (!window.wasStopped()) {window.showWidget("cloud", cloudWidget);window.spinOnce(30, true);}}std::cout << std::setfill('=') << std::setw(80) << "" << std::endl;std::cout << "Example finished! "<< std::endl;}return 0;
}

2. 编译通过后运行

3. 运行结果(也可以保存为pcd)

4. 完整代码的github 连接

https://github.com/RobotsRuning/RangeNet_ws/tree/main

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/316235.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计 基于SSM的果蔬作物疾病防治系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

第二十七章 正则表达式

第二十七章 正则表达式 1.正则快速入门2.正则需求问题3.正则底层实现14.正则底层实现25.正则底层实现36.正则转义符7.正则字符匹配8.字符匹配案例19.字符匹配案例211.选择匹配符&#xff08;|&#xff09;12.正则限定符{n}{n,m}&#xff08;1个或者多个&#xff09;*(0个或者多…

介绍两本书《助推》与《耐力》

冠历最后一年已经养成了没有冲突的情况下每天跑步、读书的习惯&#xff0c;今天突发奇想&#xff1a;是否重新挑战下每日写作。 ​ 今天介绍两本书。第一本是《助推》&#xff0c;这本书是由于真友 吾真本 的介绍开始读的。 一句话介绍这本书&#xff0c;那就是&#xff1a;如果…

Hive08_分区表

一 分区表 1 概念&#xff1a; 分区表实际上就是对应一个 HDFS 文件系统上的独立的文件夹&#xff0c;该文件夹下是该分区所 有的数据文件。Hive 中的分区就是分目录&#xff0c;把一个大的数据集根据业务需要分割成小的数据 集。在查询时通过 WHERE 子句中的表达式选择查询…

机器人制作开源方案 | 多地形适应野外探索智能车

1. 作品基本介绍 如今&#xff0c;智能机器人在军事、制造业、交通运输、航天航空、医疗、服务等领域已有广泛的应用&#xff0c;智能车是机器人研究领域的一项重要基础内容&#xff0c;在各种移动机构中&#xff0c;最为常见的是轮式移动方式&#xff0c;当今社会正处于科技高…

Linux 断言的使用

断言为我们提供了一种可以静态或动态地检查程序在目标平台上整体状态的能力&#xff0c;与它相关的接口由头文件 assert.h 提供

霹雳吧啦Wz《pytorch图像分类》-p4GoogLeNet网络

《pytorch图像分类》p4GoogLeNet网络详解 一、GoogLeNet网络中的亮点1.inception结构2.使用11的卷积核进行降维及映射处理3.GoogLeNet辅助分类器4.模型参数 二、模块代码1.BasicConv2d2.Inception 三、课程代码1.module.py2.train.py3.predict.py 一、GoogLeNet网络中的亮点 论…

ES(Elasticsearch)的基本使用

一、常见的NoSQL解决方案 1、redis加粗样式 Redis是一个基于内存的 key-value 结构数据库。Redis是一款采用key-value数据存储格式的内存级NoSQL数据库&#xff0c;重点关注数据存储格式&#xff0c;是key-value格式&#xff0c;也就是键值对的存储形式。与MySQL数据库不同&a…

助力成长的开源项目 —— 筑梦之路

闯关式 SQL 自学&#xff1a;sql-mother 免费的闯关式 SQL 自学教程网站&#xff0c;从 0 到 1 带大家掌握常用 SQL 语法&#xff0c;目前一共有 30 多个关卡&#xff0c;希望你在通关的时候&#xff0c;变身为一个 SQL 高手。除了闯关模式之外&#xff0c;这个项目支持自由选…

剑指 Offer(第2版)面试题 68:树中两个结点的最低公共祖先

剑指 Offer&#xff08;第2版&#xff09;面试题 68&#xff1a;树中两个结点的最低公共祖先 剑指 Offer&#xff08;第2版&#xff09;面试题 68&#xff1a;树中两个结点的最低公共祖先解法1&#xff1a;递归拓展题&#xff1a;二叉搜索树的最近公共祖先解法1&#xff1a;两次…

java面向对象构造器--学习笔记

什麽是构造器&#xff1f; 构造器就是一种特殊的方法&#xff0c;特殊在&#xff1a; 方法名 类名不能写返回值类 只要声明了这么一个特殊的方法&#xff0c;那么这个方法就不叫方法&#xff0c;叫做构造器了 构造器有什么特点&#xff1f; 创建对象时&#xff0c;对象会去…

STM32 学习(二)GPIO

目录 一、GPIO 简介 1.1 GPIO 基本结构 1.2 GPIO 位结构 1.3 GPIO 工作模式 二、GPIO 输出 三、GPIO 输入 1.1 传感器模块 1.2 开关 一、GPIO 简介 GPIO&#xff08;General Purpose Input Output&#xff09;即通用输入输出口。 1.1 GPIO 基本结构 如下图&#xff0…