转自:http://blog.csdn.net/u013832676/article/details/44186699
这个现在看来,可能是觉得走了弯路了。因为我们是可以直接将点云数据保存在pcd文件中的,不用先保存在txt文档里然后再转换为ipcd文件里。但是学习就是这么一个过程。我转载这篇文章,主要也是因为自己在学习的过程中的确也是这样做的,一步步来,慢慢的学习。不可能一口吃成一个大胖子!
由于pcl点云库中的大多数方法的操作都是针对于pcd文件进行的,对于xyz坐标的txt文件的操作需要转化成pcd,今晚整理了一下将点云xyz坐标的txt文件转化成pcd文件方法。首先,统计txt文件中点的个数,即通过使用fgetc函数来统计\n的个数,然后将返回值作为pcd文件中点的个数。
使用以下代码实现:
struct lin
{
double a[6];
};
int main()
{
int n=121994;
int c=0;
lin st_1[n];
int m = 0;
/////////////////////////////////以下为计算txt文件中点的数量////////////////////////////////////////
// FILE *fp;
// fp = fopen("/Users/pangshuxin/dataset/to pang/to pang/scan02.txt","r");
//
// do{
// c = fgetc(fp);
// if(c == '\n'){
// ++m;
// }
// }
// while(c != EOF);
//
// fclose(fp);
// std::cout << m <<std::endl;
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
std::cout<<n<<std::endl;
FILE *fp_1;
fp_1 = fopen("/Users/pangshuxin/dataset/to pang/to pang/scan02.txt","r");
std::cout << n <<std::endl;
for(int i=0; i<n; ++i){
if(6==fscanf(fp_1,"%lf,%lf,%lf,%lf,%lf,%lf\n", &st_1[i].a[0],&st_1[i].a[1],&st_1[i].a[2],&st_1[i].a[3],&st_1[i].a[4],&st_1[i].a[5])){
// std::cout<<st_1[i].a[0]<<std::endl;
}
}
fclose(fp_1);
std::cout<<"ok"<<std::endl;
pcl::PointCloud<pcl::PointXYZ> cloud;
// Fill in the cloud data
cloud.width = n;
cloud.height = 1;
cloud.is_dense = false;
cloud.points.resize (cloud.width * cloud.height);
for (size_t i = 0; i < cloud.points.size (); ++i)
{
cloud.points[i].x = st_1[i].a[0];
cloud.points[i].y = st_1[i].a[1];
cloud.points[i].z = st_1[i].a[2];
}
pcl::io::savePCDFileASCII ("/Users/pangshuxin/dataset/1/b.pcd", cloud);
std::cerr << "Saved " << cloud.points.size () << " data points to test_pcd.pcd." << std::endl;
for (size_t i = 0; i < cloud.points.size (); ++i)
std::cerr << " " << cloud.points[i].x << " " << cloud.points[i].y << " " << cloud.points[i].z << std::endl;
return 0;
}
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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82