使用 pcl 可视化工具的点云

Point cloud using pcl visualizer

提问人:Nikitha 提问时间:8/23/2023 最后编辑:Nikitha 更新时间:8/26/2023 访问量:44

问:

我有一个点云数据,它是一个层文件。使用 pcl 库,我尝试可视化数据。但是当尝试执行单击事件时,我得到了坐标(435,234)。我的疑问是 (435,234) 的单位是什么,因为我正在尝试使用 pcl 在屏幕上执行单击事件。

我怀疑它是否可以是像素坐标。由于它是使用 pcl 的层文件可视化,我想知道它背后的单位或度量。

#include <iostream>
#include <pcl/io/ply_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/console/parse.h>
#include <thread>
#include <chrono>
#include <pcl/filters/statistical_outlier_removal.h>
#include <Eigen/Core> 
#include <cmath> 


pcl::PointXYZRGB clicked_points[2];
int num_clicked = 0;

struct Point {
    double x;
    double y;
};

void mouseEventOccurred(const pcl::visualization::MouseEvent& event, void* viewer_void)
{
    pcl::visualization::PCLVisualizer* viewer = static_cast<pcl::visualization::PCLVisualizer*>(viewer_void);
    if (event.getButton() == pcl::visualization::MouseEvent::LeftButton && event.getType() == pcl::visualization::MouseEvent::MouseButtonRelease)
    {
        clicked_points[num_clicked % 2].x = event.getX();
        clicked_points[num_clicked % 2].y = event.getY();
        std::cout << "point_clicked->(" << clicked_points[num_clicked % 2].x << "," << clicked_points[num_clicked % 2].y << ")" << std::endl;
        num_clicked++;

        if (num_clicked % 2 == 0)//calculate distance for every pair of two clicked points
        {
            double distance = std::sqrt(std::pow(clicked_points[1].x - clicked_points[0].x, 2) + std::pow(clicked_points[1].y - clicked_points[0].y, 2));
            std::cout << "Distance between clicked points->" << distance << std::endl;
        }
    }
}

int main()
{
    pcl::console::setVerbosityLevel(pcl::console::L_ERROR);
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
    pcl::io::loadPLYFile("humanoid.ply", *cloud);
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZRGB>);
    pcl::visualization::PCLVisualizer viewer("Point_Cloud");
    viewer.setBackgroundColor(0.0, 0.0, 0.0);
    viewer.addPointCloud<pcl::PointXYZRGB>(cloud_filtered, pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB>(cloud_filtered),"filtered_cloud");
    viewer.registerMouseCallback(mouseEventOccurred, (void*)&viewer);

    while (!viewer.wasStopped()) {
        viewer.spinOnce(100, true);
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
    return 0;
}

这是代码。在这里,我必须执行距离,因此当尝试使用单击事件查找它时,我对度量有疑问,因为单击的坐标是 2D。

同样,就我而言,我必须找到给定物体的曲面的距离,那么有没有办法将我在屏幕上单击的 2D 点与单击部分的原始 3D 数据进行映射。

指标 PCL

评论

0赞 Marco F. 8/24/2023
你如何点击?是否使用 PointPickingEvent?向我们展示一些代码。没有给出指标。如果源数据以米为单位,则为米。如果是毫米,那么它就是毫米。

答: 暂无答案