pcl讀取pcd文件並顯示,kitti數據集bin與pcd文件互相轉換

pcl讀取pcd文件並顯示

#include <iostream> //標準輸入輸出流
#include <pcl/io/pcd_io.h> //PCL的PCD格式文件的輸入輸出頭文件
#include <pcl/point_types.h> //PCL對各種格式的點的支持頭文件
#include <pcl/visualization/cloud_viewer.h>//點雲查看窗口頭文件
int main(int argc, char** argv)
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); // 創建點雲(指針)

    if (pcl::io::loadPCDFile<pcl::PointXYZ>("D:\\bun0.pcd", *cloud) == -1) //* 讀入PCD格式的文件,如果文件不存在,返回-1
    {
        PCL_ERROR("Couldn't read file test_pcd.pcd \n"); //文件不存在時,返回錯誤,終止程序。
        return (-1);
    }
    pcl::visualization::CloudViewer viewer("Simple Cloud Viewer");//直接創造一個顯示窗口
    viewer.showCloud(cloud);//再這個窗口顯示點雲
    while (!viewer.wasStopped())
    {
    }
    return (0);
}

kitti數據集bin轉pcd

#include <pcl/visualization/cloud_viewer.h>
#include <iostream>//標準C++庫中的輸入輸出類相關頭文件。
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>//pcd 讀寫類相關的頭文件。
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h> //PCL中支持的點類型頭文件。
#include <boost/random.hpp>  //高斯噪點測試
#include <fstream>  
#include <string>  
#include <vector> 
#include <pcl/features/integral_image_normal.h>
#include <pcl/features/normal_3d.h>
using namespace std;
//讀取了反射強度
void bin2pcdR(const char *filenameInput, const char *filenameOutput) {//批量轉換,filenameList用於保存文件名
	int32_t num = 1000000;
	float *data = (float*)malloc(num * sizeof(float));
	// 點
	float *px = data + 0;
	float *py = data + 1;
	float *pz = data + 2;
	float *pr = data + 3;//反射強度
	// 讀取點雲數據
	FILE *stream;
	fopen_s(&stream, filenameInput, "rb");
	num = fread(data, sizeof(float), num, stream) / 4;//讀入點雲數據,大概10萬+個點
	fclose(stream);
	//轉換成PCD
	//寫文件聲明
	/*string previous = "G:/pcl_source/pcl_test/pcl_test/pcd/data/00000000";
	string tmp1 = previous.append(to_string(version));
	string tmp2 = tmp1.append(".pcd");
	const char* outputFilename = tmp2.c_str();*/
	FILE *writePCDStream;
	fopen_s(&writePCDStream, filenameOutput, "wb");
	fprintf(writePCDStream, "VERSION 0.7\n");//版本說明
	fprintf(writePCDStream, "FIELDS x y z intensity\n");//維度說明
	fprintf(writePCDStream, "SIZE 4 4 4 4\n");//佔用字節說明
	fprintf(writePCDStream, "TYPE F F F F\n");//具體數據類型定義
	fprintf(writePCDStream, "WIDTH %d\n", num);//點數量
	fprintf(writePCDStream, "HEIGHT 1\n");//無序點雲默認爲1
	fprintf(writePCDStream, "POINTS %d\n", num);//點數量
	fprintf(writePCDStream, "DATA ascii\n");//文檔使用字符類型shuom
	//寫點雲數據
	for (int32_t i = 0; i < num; i++)
	{
		fprintf(writePCDStream, "%f %f %f %f\n", *px, *py, *pz, *pr);
		px += 4; py += 4; pz += 4; pr += 4;
	}
	fclose(writePCDStream);
}

kitti數據集pcd轉bin

#include <omp.h>
#include <ctime>
#include <vector>
#include <string>
#include <algorithm>

#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>

#include <fstream>



void convertPCDtoBin(std::string &in_file, std::string& out_file)
{
	pcl::PointCloud<pcl::PointXYZI>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZI>);

	if (pcl::io::loadPCDFile<pcl::PointXYZI>(in_file, *cloud) == -1) //* load the file
	{
		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::ofstream myFile(out_file.c_str(), std::ios::out | std::ios::binary);
	for (int j = 0; j < cloud->size(); j++) {

		myFile.write((char*)& cloud->at(j).x, sizeof(cloud->at(j).x));
		myFile.write((char*)& cloud->at(j).y, sizeof(cloud->at(j).y));
		myFile.write((char*)& cloud->at(j).z, sizeof(cloud->at(j).z));
		myFile.write((char *)& cloud->at(j).intensity, sizeof(cloud->at(j).intensity));
		//myFile << cloud->at(j).x << " " << cloud->at(j).y << " " << cloud->at(j).z << endl;
	}
	myFile.close();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章