1. 讀取點雲txt文件,保存爲pcd文件
#include <pcl/io/pcd_io.h> //PCD讀寫類相關的頭文件
#include <pcl/io/ply_io.h>
#include<iostream>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>
using namespace std;
int numofPoints(char* fname)
{
int n = 0;
int c = 0;
FILE *fp;
fp = fopen(fname, "r");
do{
c = fgetc(fp);
if (c == '\n')
{
++n;
}
} while (c != EOF);
fclose(fp);
return n;
}
int main()
{
int n = 0; //n用來計文件中點個數
FILE *fp_1;
fp_1 = fopen("pointcloud.txt", "r");
if (NULL == fp_1)//檢查是否讀取文件正確
{
printf("error");
}
n = numofPoints("cloudpoint.txt");//使用numofPoints函數計算文件中點個數
cout << "there are " << n << " points in the file..." << endl;
//新建一個點雲文件,然後將結構中獲取的xyz值傳遞到點雲指針cloud中。
pcl::PointCloud<pcl::PointXYZ> cloud;//這種定義方式無法作爲指針顯示出來,但是其他都可以用
pcl::PointCloud<pcl::PointXYZ>::Ptr seecloud (new pcl::PointCloud<pcl::PointXYZ>);//但是這個沒有成員width,height,所以下方顯示時要進行一個轉換
cloud.width = n;
cloud.height = 1;
cloud.is_dense = false; //不是稠密型的
cloud.points.resize(cloud.width * cloud.height); //點雲總數的大小
//將點雲讀入並賦給新建點雲指針的xyz
double x, y, z;
int i = 0;
while (6 == fscanf(fp_1, "%lf %lf %lf\n", &x, &y, &z))
{
//cout << x << " " << y << " " << z << endl;這句要不要都行,如果輸出的話轉換的速度會很慢,因爲每個點都會讀取出來
cloud.points[i].x = x;
cloud.points[i].y = y;
cloud.points[i].z = z;
cloud.points[i].r = r;
cloud.points[i].g = g;
cloud.points[i].b = b;
++i;
}
fclose(fp_1);
//*seecloud = cloud;//要轉換一下,cloud不能直接作爲指針顯示,而是用seecloud這個Ptr
////顯示點雲
//pcl::visualization::CloudViewer viewer("Viewer");
//viewer.showCloud(seecloud);
//while (!viewer.wasStopped())
//{
//}
//pcl::io::savePCDFileASCII("03.pcd", cloud); //存儲到PCD文件
//std::cerr << "Saved " << cloud.points.size() << " data points to test_pcd.pcd." << std::endl; //保存
system("pause");
return 0;
}
錯誤:生成解決方案沒有問題,但是調試不行
百度原因說是讀取文件的問題,錯誤提示也會跳到 fgetc()這個函數,但是不知道錯在哪裏,不知道咋改,先放着吧
百度了一下fgetc()的用法,感覺沒啥問題啊