日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何读取或转换PCD点云文件

發布時間:2023/12/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何读取或转换PCD点云文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

一、Python方式

1.Open3D

2.直接用python讀取并保存成bin格式

3.pypcd

二、C++方式


一、Python方式

1.Open3D

讀取pcd文件(因為我的點云是ZED相機獲得的,所以是XYZRGBA格式,雷達的只用points這個屬性就可以讀取xyz)

import open3d as o3d import numpy as np file_path='/media/wangchen/KINGSTON/數據集/pcd to bin/125.pcd' pcd = o3d.io.read_point_cloud(file_path)#Open3d讀取到的點云通常存儲到PointCloud類中,這個類中我們常用的屬性就是points和colors points = np.asarray(pcd.points) colors = np.asarray(pcd.colors) * 255#colors中的RGB數據是歸一化的,所以要乘以255 print(points.shape, colors.shape) print(np.concatenate([points, colors], axis=-1))

處理numpy矩陣

import open3d as o3d pcd = o3d.geometry.PointCloud()#創建一個PointCloud對象 pcd.points = o3d.utility.Vector3dVector(points_array)#將矩陣變為open3d里面的數據格式

保存pcd點云

o3d.io.write_point_cloud(path, pcd , write_ascii=True)#如果有需要一定要指定保存編碼格式

2.直接用python讀取并保存成bin格式

def read_pcd(filepath):lidar = []with open(filepath, 'r', encoding='utf-8') as f:line = f.readline().strip()while line:linestr = line.split(" ")if len(linestr) == 4:linestr_convert = list(map(float, linestr))lidar.append(linestr_convert)line = f.readline().strip()return np.array(lidar) lidar=read_pcd('/media/wangchen/KINGSTON/數據集/pcd to bin/125.pcd') lidar.reshape(-1, 4).astype(np.float32) lidar.tofile('/media/wangchen/KINGSTON/數據集/pcd to bin/125.bin')

?pcd文件說白了也是一個txt,直接用python的open打開按行操作也行。而用python讀取成數組之后,我們直接tofile到一個bin文件里就完成可數據格式的轉換。

3.pypcd

這個包是python里面專門處理pcd點云的,切記他的運行環境是python2,不能是3

如何切換環境請看我的這篇博客

import pypcd ## Get pcd file pc = pypcd.PointCloud.from_path(pcd_file)## Get data from pcd (x, y, z, intensity, ring, time) np_x = (np.array(pc.pc_data['x'], dtype=np.float32)).astype(np.float32) np_y = (np.array(pc.pc_data['y'], dtype=np.float32)).astype(np.float32) np_z = (np.array(pc.pc_data['z'], dtype=np.float32)).astype(np.float32) np_i = (np.array(pc.pc_data['intensity'], dtype=np.float32)).astype(np.float32)/256 # np_r = (np.array(pc.pc_data['ring'], dtype=np.float32)).astype(np.float32) # np_t = (np.array(pc.pc_data['time'], dtype=np.float32)).astype(np.float32)## Stack all data points_32 = np.transpose(np.vstack((np_x, np_y, np_z, np_i)))## Save bin file points_32.tofile(bin_file_path)

附上一份轉換鏈接如何將自己采集到的點云數據轉換為與Kitti數據集相同的格式?(.pcd文件轉換為.bin文件)_Demo_xxx的博客-CSDN博客_matlab pcd轉bin

二、C++方式

1.PCL將pcd轉成bin

PCL對于點云的重要性就像Opencv對于圖像一樣。我用的ROS里面自帶的PCL

mkdir -p workspace1/src cd src catkin_init_workspace catkin_create_pkg read_pcd pcl_conversions pcl_ros roscpp sensor_msgs

進入到功能包的src文件夾下面新建.cpp文件read_pcd.cpp

#include <omp.h> #include <ctime> #include <vector> #include <string> #include <algorithm>#include <sys/stat.h> #include <unistd.h> #include <sys/types.h> #include <iostream> #include <fstream>#include <pcl/io/pcd_io.h> #include <pcl/common/common_headers.h>#include <sys/stat.h>#include <pcl/io/boost.h> #include <boost/program_options.hpp>void convert_pcd_to_bin(std::string path_input, std::string path_output) {std::string datapath_in = path_input; std::string datapath_out= path_output;std::vector<boost::filesystem::path> paths(boost::filesystem::directory_iterator{datapath_in}, boost::filesystem::directory_iterator{});sort(paths.begin(), paths.end());auto pcd_iter = paths.begin();int frames_all = paths.end() - paths.begin();pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>);for (int i = 0; i < frames_all; i++) {pcd_iter++;std::string in_file = pcd_iter->string();if (pcl::io::loadPCDFile<pcl::PointXYZRGBA>(in_file, *cloud) == -1) {std::string err = "Couldn't read file " + in_file;PCL_ERROR(err.c_str());return;// (-1);}std::cout << "Loaded "<< cloud->width * cloud->height<< " data points from "<< in_file<< " with the following fields: "<< std::endl;std::string out_file = datapath_out + std::to_string(i) + ".bin";std::ofstream bin_file(out_file.c_str(), std::ios::out | std::ios::binary);for (int j = 0; j < cloud->size(); j++) {bin_file.write((char*)& cloud->at(j).x, sizeof(cloud->at(j).x));bin_file.write((char*)& cloud->at(j).y, sizeof(cloud->at(j).y));bin_file.write((char*)& cloud->at(j).z, sizeof(cloud->at(j).z));//bin_file.write((char*)& cloud->at(j).intensity, sizeof(cloud->at(j).intensity));}bin_file.close();}}int main(int argc, char **argv) {if (argc <= 1) {std::cout << "please input datapath dir and output datapath dir" << std::endl;std::cout << "for example, run ./pcd2bin /home/pcds/ /home/bins/" << std::endl;return 0;}std::string path_input = argv[1];std::string path_output= argv[2];std::fstream file_in;file_in.open(path_input, std::ios::in);if (!file_in) {std::cout << "can not find the input path:" << path_input << std::endl;return 0;}std::fstream file_out;file_out.open(path_output, std::ios::in);if (!file_out) {std::cout << "can not find the output path:" << path_output << std::endl;if (0 == mkdir(path_output.data(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)) {std::cout << "successfully creat output path: " << path_output << std::endl;} else {std::cout << "create output path failed!" << std::endl;return 0;}}convert_pcd_to_bin(path_input, path_output);return 0; }

將下面的編譯規則寫入功能包下面的CMAKE.list文件中

add_executable(read_pcd src/read_pcd.cpp) target_link_libraries(read_pcd ${catkin_LIBRARIES})

然后編譯catkin_make,得到可執行文件,運行可執行文件,同時輸入兩個參數(pcd路徑,bin保存路徑)

總結

以上是生活随笔為你收集整理的如何读取或转换PCD点云文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。