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()的用法,感觉没啥问题啊