提问人:Nikitha 提问时间:8/23/2023 最后编辑:Nikitha 更新时间:8/26/2023 访问量:44
使用 pcl 可视化工具的点云
Point cloud using pcl visualizer
问:
我有一个点云数据,它是一个层文件。使用 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 数据进行映射。
答: 暂无答案
评论