输入DDIANYUNWENJIANJIA茎直径切片投影_plyply对切片投影的每一块点云进行椭圆拟合并且进行可视化然后输出每个椭圆的主轴的长度。这一操作使用pcl181可以运行的来编写
以下是使用pcl1.8.1编写的代码,用于对切片投影的每一块点云进行椭圆拟合并可视化,并输出每个椭圆的主轴长度。
#include <iostream>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/features/moment_of_inertia_estimation.h>
int main()
{
// 加载点云数据
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPLYFile<pcl::PointXYZ>("D:\\DIANYUNWENJIANJIA\\茎直径切片投影_ply.ply", *cloud);
// 创建可视化窗口
pcl::visualization::PCLVisualizer viewer("Ellipsoid Fitting");
// 设置背景颜色
viewer.setBackgroundColor(0, 0, 0);
// 创建一个平面模型,用于显示点云
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);
viewer.addPointCloud<pcl::PointXYZ>(cloud, single_color, "cloud");
// 创建MomentOfInertiaEstimation对象,用于计算点云的惯性矩
pcl::MomentOfInertiaEstimation<pcl::PointXYZ> feature_extractor;
feature_extractor.setInputCloud(cloud);
feature_extractor.compute();
std::vector<pcl::PointXYZ> min_point_AABB;
std::vector<pcl::PointXYZ> max_point_AABB;
std::vector<pcl::PointXYZ> min_point_OBB;
std::vector<pcl::PointXYZ> max_point_OBB;
pcl::PointXYZ position_OBB;
Eigen::Matrix3f rotational_matrix_OBB;
// 获取AABB包围盒的最小和最大点
feature_extractor.getAABB(min_point_AABB, max_point_AABB);
// 获取OBB包围盒的最小和最大点、中心点和旋转矩阵
feature_extractor.getOBB(min_point_OBB, max_point_OBB, position_OBB, rotational_matrix_OBB);
// 输出每个椭圆的主轴长度
for (int i = 0; i < min_point_OBB.size(); i++) {
double length = max_point_OBB[i].x - min_point_OBB[i].x;
double width = max_point_OBB[i].y - min_point_OBB[i].y;
double height = max_point_OBB[i].z - min_point_OBB[i].z;
std::cout << "Ellipsoid " << i + 1 << " main axis length: " << length << ", width: " << width << ", height: " << height << std::endl;
}
// 可视化OBB包围盒
viewer.addCube(position_OBB.x - (max_point_OBB[0].x - min_point_OBB[0].x) / 2, position_OBB.x + (max_point_OBB[0].x - min_point_OBB[0].x) / 2,
position_OBB.y - (max_point_OBB[0].y - min_point_OBB[0].y) / 2, position_OBB.y + (max_point_OBB[0].y - min_point_OBB[0].y) / 2,
position_OBB.z - (max_point_OBB[0].z - min_point_OBB[0].z) / 2, position_OBB.z + (max_point_OBB[0].z - min_point_OBB[0].z) / 2, 1, 1, 1, "OBB");
// 显示点云和包围盒
viewer.spin();
return 0;
}
请确保在编译和运行代码之前已经正确安装了pcl1.8.1,并将点云文件路径修改为您的实际路径。运行代码后,将在控制台输出每个椭圆的主轴长度,并在可视化窗口中显示点云和拟合的椭圆包围盒
原文地址: http://www.cveoy.top/t/topic/ivsb 著作权归作者所有。请勿转载和采集!