深度学习|抓取检测|数据集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版

最详细教程labview深度学习工业缺陷检测

深度学习目标检测:YOLOv5实现车辆检测(含车辆检测数据集+训练代码)

深度学习目标检测:YOLOv5实现车辆检测(含车辆检测数据集+训练代码)

12大类150个图像处理和深度学习开源数据集

12大类150个图像处理和深度学习开源数据集