深度学习|抓取检测|数据集Cornell 康奈尔数据集下载及解析 & txt 转 pcd格式 & 点云可视化
Posted 宇宙爆肝锦标赛冠军
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习|抓取检测|数据集Cornell 康奈尔数据集下载及解析 & txt 转 pcd格式 & 点云可视化相关的知识,希望对你有一定的参考价值。
实现效果
数据集来源
链接: https://pan.baidu.com/s/1IccviO-UJCoArctGVEdBkA 提取码: s0p0
基础知识
首先要了解 PCL 官方教程给出的关于 PCD 文件的格式。
PCD(点云数据)文件格式🔗
下面是康奈尔数据集中 pcd0100.txt 的内容:
# .PCD v.7 - Point Cloud Data file format # 指定PCD文件版本
# FIELDS 指定点可以拥有的每个维度/字段的名称
FIELDS x y z rgb index
# SIZE 指定每个维度的大小(以字节为单位),其中,无符号int/int/float有4字节
SIZE 4 4 4 4 4
# TYPE 以字符的形式指定每个维度的类型
# U-表示无符号类型uint8(无符号字符),uint16(无符号短),uint32(无符号int)
# F-表示浮点类型
TYPE F F F F U
# COUNT 指定每个维度有多少个元素
COUNT 1 1 1 1 1
# WIDTH 指定点云数据集的宽度,在这里指定无组织数据集的云中点总数,因为 HEIGHT = 1
WIDTH 253674
# HEIGHT 指定点云数据集的高度,以点数为大小。这里是无组织数据集,所以设置为 1
HEIGHT 1
# VIEWPOINT 为数据集中的点指定获取视图,视图信息指定为平移(tx ty tz)+四元数(qw qx qy qz)
VIEWPOINT 0 0 0 1 0 0 0
# POINTS 指定云中的点总数
POINTS 253674
# DATA 指定存储点云数据的数据类型
DATA ascii
1924.064 -647.111 -119.4176 0 25547
1924.412 -649.678 -119.7147 0 25548
1919.929 -650.5591 -116.9839 0 25549
1920.276 -653.1166 -117.2799 0 25550
1920.622 -655.6741 -117.576 0 25551
可视化
利用 pcl_viewer
这个可执行文件可以直接可视化 pcd 文件,但遗憾的是我们的康奈尔数据集给出的是 txt 格式。
文件格式转换(txt 转 pcd)
- 自己参考官方教程和一些博客,然后写的代码,可以通过编译并运行。
- 代码实现的功能:读取康奈尔数据集中的txt文件,写入pcd文件并可视化。
代码中参考了如下链接:
[1] PCL可视化工具
[2] 【PCL学习】将pcd格式点云与txt格式文本互转
//
// Created by zth on 2021/8/10.
//
#include <iostream>
#include <string>
#include <vector>
#include <thread>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
//定位到txt文件的某一行(注意:从第0行算起)
std::ifstream & seek_to_line(std::ifstream & in, int line_num)
//将打开的文件in,定位到line行。
{
std::string info_line;
in.seekg(0, std::ios::beg); //定位到文件开始。
std::cout << "文件信息:" << std::endl;
for (int i = 0; i < line_num; i++)
{
getline(in,info_line);
std::cout << info_line << std::endl;
}
return in;
}
// 按空格分割 string
std::vector<std::string> split(const std::string& str, const std::string& delim) {
std::vector<std::string> res;
if("" == str) return res;
//先将要切割的字符串从string类型转换为char*类型
char * strs = new char[str.length() + 1] ; //不要忘了
strcpy(strs, str.c_str());
char * d = new char[delim.length() + 1];
strcpy(d, delim.c_str());
char *p = strtok(strs, d);
while(p) {
std::string s = p; //分割得到的字符串转换为string类型
res.push_back(s); //存入结果数组
p = strtok(NULL, d);
}
return res;
}
// 可视化点云
pcl::visualization::PCLVisualizer::Ptr rgbVis (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)
{
// --------------------------------------------
// -----Open 3D viewer and add point cloud-----
// --------------------------------------------
pcl::visualization::PCLVisualizer::Ptr viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
viewer->setBackgroundColor (0, 0, 0);
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud");
viewer->addCoordinateSystem (100.0); // 添加坐标系
return (viewer);
}
int main() {
// 定义点云数据结构体
typedef struct tagPOINT_3D{
float x;
float y;
float z;
float rgb;
int index;
}POINT_WORLD;
// 读取 txt 文件
tagPOINT_3D point_3d;
std::ifstream infile("../data-1/pcd0148.txt");
std::string filename;
std::string line;
std::vector<tagPOINT_3D> point_vec; // 存储点云文件的数据行
if(infile) // 有该文件
{
seek_to_line(infile, 10);
while (getline (infile, line)) // line中不包括每行的换行符
{
// 将 string 转化为 float 和 int 型并赋给结构体
point_3d.x = stod(split(line, " ")[0]);
point_3d.y = stod(split(line, " ")[1]);
point_3d.z = stod(split(line, " ")[2]);
point_3d.rgb = stod(split(line, " ")[3]);
point_3d.index = stoi(split(line, " ")[4]);
point_vec.push_back(point_3d);
}
std::cout << "开始打印" << std::endl;
for(int i=0;i<3;i++){
std::cout << point_vec[i].x << point_vec[i].y << point_vec[i].z << point_vec[i].rgb << std::endl;
}
}
else // 没有该文件
{
std::cout <<"no such file" << std::endl;
}
// 写入点云文件
pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZRGB>);
point_cloud_ptr->width = point_vec.size();
point_cloud_ptr->height = 1;
point_cloud_ptr->is_dense = false;
point_cloud_ptr->resize(point_cloud_ptr->width * point_cloud_ptr->height);
for(int i = 0; i < point_vec.size(); i++){
point_cloud_ptr->points[i].x = point_vec[i].x;
point_cloud_ptr->points[i].y = point_vec[i].y;
point_cloud_ptr->points[i].z = point_vec[i].z;
point_cloud_ptr->points[i].rgb = point_vec[i].rgb;
}
pcl::io::savePCDFileASCII ("test_pcd.pcd", *point_cloud_ptr);
std::cerr << "Saved " << point_cloud_ptr->size () << " data points to test_pcd.pcd." << std::endl;
// 可视化点云
pcl::visualization::PCLVisualizer::Ptr viewer;
viewer = rgbVis(point_cloud_ptr);
// 窗口刷新
// 方法 1:
// while (!viewer->wasStopped ())
// {
// viewer->spinOnce (100);
// std::this_thread::sleep_for(std::chrono::milliseconds(100));//睡眠100毫秒
// }
// 方法 2:
viewer->spin();
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
project(txt2pcd)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/opt/homebrew/Cellar/qt@5/5.15.2/lib/cmake/Qt5")
#find_package(PCL 1.12 REQUIRED COMPONENTS common io)
find_package(PCL 1.12 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS}) # 包含头文件目录
link_directories(${PCL_LIBRARY_DIRS}) # 设置依赖库链接目录
add_definitions(${PCL_DEFINITIONS}) # 添加预处理器和编译器标记
add_executable(txt2pcd main2.cpp)
target_link_libraries(txt2pcd ${PCL_LIBRARIES})
以上是关于深度学习|抓取检测|数据集Cornell 康奈尔数据集下载及解析 & txt 转 pcd格式 & 点云可视化的主要内容,如果未能解决你的问题,请参考以下文章
[深度学习][原创][课程]DETR训练自己的目标检测数据集ubuntu版
深度学习目标检测:YOLOv5实现车辆检测(含车辆检测数据集+训练代码)