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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

遍历文件夹进行点云格式转换 PCD转BIN BIN转PCD PCD转TXT TXT转PCD PLY转PCD

發(fā)布時(shí)間:2023/12/16 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 遍历文件夹进行点云格式转换 PCD转BIN BIN转PCD PCD转TXT TXT转PCD PLY转PCD 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 點(diǎn)云格式轉(zhuǎn)換
    • 1. C++ PCL PCD2BIN BIN2PCD
    • 2. C++ PCL PCD2TXT
    • 3. python PCD2TXT
    • 4. python TXT2PCD
    • 5. python PLY2PCD

點(diǎn)云格式轉(zhuǎn)換

1. C++ PCL PCD2BIN BIN2PCD

  • 運(yùn)行這個(gè)文件需安裝配置PCL環(huán)境
#include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <string> #include <vector> #include <stdio.h> //#include <dirent.h> #include <io.h> using namespace std;//遍歷文件夾獲取文件夾下文件名 void getFileNames(string path, vector<string>& files) {//文件句柄intptr_t hFile = 0;//文件信息struct _finddata_t fileinfo;string p;if ((hFile = _findfirst(p.assign(path).append("/*").c_str(), &fileinfo)) != -1){do{//如果是目錄,遞歸查找//如果不是,把文件絕對(duì)路徑存入vector中if ((fileinfo.attrib & _A_SUBDIR)){if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)getFileNames(p.assign(path).append("/").append(fileinfo.name), files);}else{files.push_back(p.assign(path).append("/").append(fileinfo.name));}} while (_findnext(hFile, &fileinfo) == 0);_findclose(hFile);} }void pcd2bin(string in_file, string out_file) {//Create a PointCloud valuepcl::PointCloud<pcl::PointXYZI>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZI>);//Open the PCD fileif (pcl::io::loadPCDFile<pcl::PointXYZI>(in_file, *cloud) == -1){PCL_ERROR("Couldn't read in_file\n");}//Create & write .bin fileofstream bin_file(out_file.c_str(), ios::out | ios::binary | ios::app);if (!bin_file.good()) cout << "Couldn't open " << out_file << endl;//PCD 2 BIN for (size_t i = 0; i < cloud->points.size(); ++i){bin_file.write((char*)&cloud->points[i].x, 3 * sizeof(float));bin_file.write((char*)&cloud->points[i].intensity, sizeof(float));//bin_file.write(0, sizeof(float));}bin_file.close(); } void bin2pcd(string in_file, string out_file) {fstream input(in_file.c_str(), ios::in | ios::binary);if (!input.good()) {cerr << "Couldn't read in_file: " << in_file << endl;}pcl::PointCloud<pcl::PointXYZI>::Ptr points(new pcl::PointCloud<pcl::PointXYZI>);int i;for (i = 0; input.good() && !input.eof(); i++) {pcl::PointXYZI point;input.read((char *)&point.x, 3 * sizeof(float));input.read((char *)&point.intensity, sizeof(float));points->push_back(point);}input.close();pcl::io::savePCDFileASCII(out_file, *points); } int main(int argc, char** argv) {vector<string> fileNames;//將路徑更改為要修改的點(diǎn)云的存儲(chǔ)目錄路徑string path("E:/DataSet/Tof_Image/PCDcloud/"); getFileNames(path, fileNames);for (const auto &ph : fileNames) {std::cout << "ph: "<< ph<< "\n";//不帶路徑的文件名string::size_type iPos = ph.find_last_of("/") + 1;string filename = ph.substr(iPos, path.length() - iPos);cout <<"filename: "<< filename << endl;//不帶后綴的文件名string name = filename.substr(0, filename.rfind("."));cout <<"name: "<< name << endl;//記得將這里的路徑改為自己轉(zhuǎn)換后的點(diǎn)云要存儲(chǔ)的文件路徑//pcd格式的點(diǎn)云轉(zhuǎn)成bin格式的,對(duì)于不含強(qiáng)度信息的點(diǎn)云會(huì)提示缺少?gòu)?qiáng)度intensity信息,但還是可以轉(zhuǎn)換成功pcd2bin(ph, "E:/DataSet/Tof_Image/binCloud/"+ name+".bin");//bin格式的點(diǎn)云轉(zhuǎn)成pcd格式的,使用方法注釋上面那行,取消注釋下面這行。//bin2pcd(ph, "E:/DataSet/PCD/" + name + ".pcd");}return 0; }

2. C++ PCL PCD2TXT

#include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/filters/voxel_grid.h>using namespace std;void pclDownsize(pcl::PointCloud<pcl::PointXYZ>::Ptr in, pcl::PointCloud<pcl::PointXYZ>::Ptr out) {pcl::VoxelGrid<pcl::PointXYZ> down_filter;float leaf = 0.1;down_filter.setLeafSize(leaf, leaf, leaf);down_filter.setInputCloud(in);down_filter.filter(*out); }//遍歷文件夾獲取文件夾下文件名 void getFileNames(string path, vector<string>& files) {intptr_t hFile = 0;struct _finddata_t fileinfo;string p;if ((hFile = _findfirst(p.assign(path).append("/*").c_str(), &fileinfo)) != -1){do{//如果是目錄,遞歸查找//如果不是,把文件絕對(duì)路徑存入vector中if ((fileinfo.attrib & _A_SUBDIR)){if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)getFileNames(p.assign(path).append("/").append(fileinfo.name), files);}else{files.push_back(p.assign(path).append("/").append(fileinfo.name));}} while (_findnext(hFile, &fileinfo) == 0);_findclose(hFile);} } void pcd2txt(string in_file, string out_file) {pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);// pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out(new pcl::PointCloud<pcl::PointXYZ>);// Fill in the cloud data if (pcl::io::loadPCDFile<pcl::PointXYZ>(in_file, *cloud) == -1){PCL_ERROR("Couldn't read file \n");//return (0);}// pclDownsize(cloud,cloud_out);cout << "points cloud is successfully loaded! " << endl;//for (size_t i = 0; i < cloud->points.size(); i++)// std::cout << " " << cloud->points[i].x << " " << cloud->points[i].y// <<" "<< cloud->points[i].z << std::endl;int Num = cloud->points.size();double *X = new double[Num] {0};double *Y = new double[Num] {0};double *Z = new double[Num] {0};cout << "size is : " << cloud->points.size() << endl;for (size_t i = 0; i < cloud->points.size(); ++i){X[i] = cloud->points[i].x;Y[i] = cloud->points[i].y;Z[i] = cloud->points[i].z;//cout << "first " << i << " of " << Num << endl;}ofstream zos(out_file);for (int i = 0; i < cloud->points.size(); i++){zos << X[i] << " " << Y[i] << " " << Z[i] << endl;//cout << "second " << i << " of " << Num << endl;}cout << "trans has done!!!" << endl;//cin.get(); } int main(int argc, char *argv[]) {vector<string> fileNames;string path("E:/DataSet/points"); getFileNames(path, fileNames);for (const auto &ph : fileNames) {std::cout << "ph: " << ph << "\n";//不帶路徑的文件名string::size_type iPos = ph.find_last_of("/") + 1;string filename = ph.substr(iPos, path.length() - iPos);cout << "filename: " << filename << endl;//不帶后綴的文件名string name = filename.substr(0, filename.rfind("."));cout << "name: " << name << endl;pcd2txt(ph, "E:/DataSet/bin/" + name + ".txt");}return 0; }

3. python PCD2TXT

import os from os import listdir, pathpath_str = 'E:/desktop/PointCloud/OpenPCDet/data/carton/testing/points' # your directory path txts = [f for f in listdir(path_str)if f.endswith('.pcd') and path.isfile(path.join(path_str, f))]for txt in txts:with open(os.path.join(path_str, txt), 'rb') as f:lines = f.readlines()with open(os.path.join(path_str,os.path.splitext(txt)[0]+".txt"), 'w') as f:line = str(line)f.write(''.join(lines[11:]))""" import os #定義一個(gè)三維點(diǎn)類(lèi) class Point(object):def __init__(self,x,y,z):self.x = xself.y = yself.z = z points = [] path = 'E:/desktop/PointCloud/OpenPCDet/data/carton/testing/points/cloudnorm_000002' #讀取pcd文件,從pcd的第12行開(kāi)始是三維點(diǎn) with open(path+'.pcd') as f:for line in f.readlines()[11:len(f.readlines())-1]:strs = line.split(' ')points.append(Point(strs[0],strs[1],strs[2].strip())) ##strip()是用來(lái)去除換行符 ##把三維點(diǎn)寫(xiě)入txt文件 fw = open(path+'.txt','w') for i in range(len(points)):linev = points[i].x+" "+points[i].y+" "+points[i].z+"\n"fw.writelines(linev) fw.close()import math import os import pcldef txt2pcd(filename):xlist = []ylist = []zlist = []with open(filename, 'r') as file_to_read:while True:lines = file_to_read.readline()if not lines:breakpassx, y, z = [float(i) for i in lines.split(' ')]print(str(x) + ' ' + str(y) + ' ' + str(z))xlist.append(x)ylist.append(y)zlist.append(z)savefilename = './test_1.pcd'if not os.path.exists(savefilename):f = open(savefilename, 'w')f.close()with open(savefilename, 'w') as file_to_write:file_to_write.writelines("# .PCD v0.7 - Point Cloud Data file format\n")file_to_write.writelines("VERSION 0.7\n")file_to_write.writelines("FIELDS x y z\n")file_to_write.writelines("SIZE 4 4 4\n")file_to_write.writelines("TYPE F F F\n")file_to_write.writelines("COUNT 1 1 1\n")file_to_write.writelines("WIDTH " + str(len(xlist)) + "\n")file_to_write.writelines("HEIGHT 1\n")file_to_write.writelines("VIEWPOINT 0 0 0 1 0 0 0\n")file_to_write.writelines("POINTS " + str(len(xlist)) + "\n")file_to_write.writelines("DATA ascii\n")for i in range(len(xlist)):file_to_write.writelines(str(xlist[i]) + " " + str(ylist[i]) + " " + str(zlist[i]) + "\n")def pcd2txt(pcdfile):p = pcl.load(pcdfile)savetxtfile = './test_1_inliers.txt'with open(savetxtfile, 'w') as f:f.write(str(p.size) + 'points in total' + '\n')# print(p[i])for i in range(p.size):x = str(p[i][0])y = str(p[i][1])z = str(p[i][2])f.write(x + ' ' + y + ' ' + z + '\n')if __name__ == '__main__':txtfile = './3dposition.txt'pcdfile = './pcldata/tutorials/test_1.pcd'txt2pcd(txtfile)pcd2txt(pcdfile) """

4. python TXT2PCD

  • 這個(gè)不是遍歷文件夾更改更改的是單個(gè)
import numpy as np import open3d as o3d## 數(shù)據(jù)讀取 np.set_printoptions(suppress=True) # 取消默認(rèn)的科學(xué)計(jì)數(shù)法 Data1 = np.loadtxt('F:/information/car_0001.txt', dtype=np.float, skiprows=1,delimiter=' ', usecols=(0, 1, 2), unpack=False) ## open3d數(shù)據(jù)轉(zhuǎn)換 pcd = o3d.geometry.PointCloud() pcd.points = o3d.utility.Vector3dVector(Data1) # print(np.asarray(pcd.points)) o3d.visualization.draw_geometries([pcd]) ## 保存成ply數(shù)據(jù)格式 # o3d.io.write_point_cloud('xxx.ply', pcd, write_ascii=True) # ascii編碼 # o3d.io.write_point_cloud('xxx.ply', pcd, write_ascii=False) # 非ascii編碼 ## 保存成pcd數(shù)據(jù)化格式 o3d.io.write_point_cloud('F:/information/car_0001.pcd', pcd, write_ascii=True) # ascii編碼 # o3d.io.write_point_cloud('xxx.pcd', pcd, write_ascii=True) # 非ascii編碼

5. python PLY2PCD

import open3d as o3d import numpy as np import osdef alter(name):filename = os.path.splitext(name)[0]pcd = o3d.io.read_point_cloud('E:/DataSet/Tof_Image/cloud_image/' + name)print(pcd)o3d.io.write_point_cloud('E:/DataSet/Tof_Image/PCDcloud/' + filename + ".pcd", pcd)print(filename)if __name__ == '__main__':path1 = 'E:/DataSet/Tof_Image/cloud_image/'list = os.listdir(path1)print(list)for i in list:alter(i)
  • 等后面有空再補(bǔ)充其他轉(zhuǎn)換方式的

總結(jié)

以上是生活随笔為你收集整理的遍历文件夹进行点云格式转换 PCD转BIN BIN转PCD PCD转TXT TXT转PCD PLY转PCD的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。