|

楼主 |
发表于 2025-4-11 15:08:27
|
显示全部楼层
加入 PCL Viewer 的可视化代码
在前面代码的基础上,加入以下内容:
#include <pcl/visualization/pcl_visualizer.h>
#include <thread>
// 可视化函数
void visualize(const pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud,
const Eigen::Vector3f& centroid,
const Eigen::Vector3f& axis,
float min_radius,
float max_radius,
float height = 10.0f) {
pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("Cylinder Fit Viewer"));
viewer->setBackgroundColor(0, 0, 0);
// 显示原始点云
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color(cloud, 255, 255, 255);
viewer->addPointCloud<pcl::PointXYZ>(cloud, cloud_color, "cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud");
// 显示拟合轴线
Eigen::Vector3f p1 = centroid - axis * (height / 2.0f);
Eigen::Vector3f p2 = centroid + axis * (height / 2.0f);
viewer->addLine(pcl::PointXYZ(p1[0], p1[1], p1[2]),
pcl::PointXYZ(p2[0], p2[1], p2[2]),
0.0, 1.0, 0.0, "fitted_axis");
viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_LINE_WIDTH, 3, "fitted_axis");
// 显示最大外圆柱(红色)
viewer->addCylinder(
pcl::ModelCoefficients{ .values = { centroid[0], centroid[1], centroid[2],
axis[0], axis[1], axis[2], max_radius } },
"outer_cylinder");
viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1.0, 0.0, 0.0, "outer_cylinder");
viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, 0.3, "outer_cylinder");
// 显示最小内圆柱(蓝色)
viewer->addCylinder(
pcl::ModelCoefficients{ .values = { centroid[0], centroid[1], centroid[2],
axis[0], axis[1], axis[2], min_radius } },
"inner_cylinder");
viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0.0, 0.0, 1.0, "inner_cylinder");
viewer->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, 0.3, "inner_cylinder");
// 循环可视化
while (!viewer->wasStopped()) {
viewer->spinOnce(100);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
🧪 如何调用?
在 main() 最后调用:
visualize(cloud, centroid, axis, min_r, max_r, height);
确保 height 设置为实际点云的高度范围。
💡 结果效果
你将看到:
白色点:原始采样点
绿色线:拟合主轴
红色透明圆柱:最大外包圆柱
蓝色透明圆柱:最小内接圆柱
中间的距离差就是你实际的 圆柱度误差,可以清晰直观地看到最大/最小偏差点。
📦 构建与运行
确保你在 CMakeLists.txt 中链接了 pcl_visualization:
find_package(PCL REQUIRED COMPONENTS common io visualization)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable(cylinder_fit main.cpp)
target_link_libraries(cylinder_fit ${PCL_LIBRARIES})
✅ 你可以进一步…
高亮显示超出公差的点(加颜色)
动态显示点到圆柱面的距离残差
输出残差热图(Heatmap) |
|