当前软件为PCL1.12+VS2022
PCL初学者
问题为,代码运行结果有时正确有时不正确求指教,是哪里出现的问题?
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/crop_box.h>
#include <vector>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/PointIndices.h>
#include <pcl/filters/extract_indices.h>
using namespace std;
struct pointt
{
int index=0;
float x=0;
float z=0;
};
struct Profile1
{
float y=0;
vector<pointt> pointss;
};
vector<pointt> getprofile(float y, float stepY, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1)//获得断面
{
pcl::PointCloud<pcl::PointXYZ>::Ptr croppedCloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointIndices::Ptr croppedindices(new pcl::PointIndices);
pcl::CropBox<pcl::PointXYZ> crop;
float minX = -1; // 裁剪框在 x 轴上的最小值
float minZ = -1; // 裁剪框在 z 轴上的最小值
float maxX = 4; // 裁剪框在 x 轴上的最大值
float maxZ = 4; // 裁剪框在 z 轴上的最大值
crop.setInputCloud(cloud1);
crop.setMin(Eigen::Vector4f(minX, y, minZ, 1.0));
crop.setMax(Eigen::Vector4f(maxX, y + stepY, maxZ, 1.0));
crop.filter(*croppedCloud);
crop.getRemovedIndices(*croppedindices); // 获取被移除的点的索引
struct pointt p1 = { 0,0,0 };
vector<pointt> numbers;
for (int i = 0; i < croppedCloud->points.size(); i++)
{
p1.x = croppedCloud->points[i].x;
p1.z = croppedCloud->points[i].z;
p1.index = i;
numbers.push_back(p1);
}
croppedCloud.reset();
croppedindices.reset();
return numbers;
}
vector<Profile1> profile(float minY, float maxY, float stepY, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)//循环获得断面
{
vector<Profile1> members;
Profile1 pf = { 0.0, vector<pointt>() };;
for (float y = minY; y <= maxY;)
{
pf.pointss = getprofile(y, stepY, cloud);
pf.y = y;
if (pf.pointss.empty())
{
}
else
{
members.push_back(pf);
}
y = y + stepY;
}
return members;
}
int main(int argc, char** argv)
{
float minY = -0.18; // 裁剪框在 y 轴上的最小值
float maxY = 0.18; // 裁剪框在 y 轴上的最大值
float stepY = 0.005; // 沿 y 轴的步长
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile<pcl::PointXYZ>("rabbit.pcd", *cloud);
vector<Profile1> members = profile(minY, maxY, stepY, cloud);
for (int i = 0; i < members.size(); i++)//测试代码正确性
{
cout << "里程为" << members[i].y << endl;
//for (int j = 0; j < members[i].pointss.size(); j++)
//{
// cout << "x为" << members[i].pointss[j].x << "z为" << members[i].pointss[j].z << "索引为" << members[i].pointss[j].index << endl;
//}
}
cloud.reset();
system("pause");
return 0;
}