【问题标题】:How can I save a PCD file from a Kinect?如何从 Kinect 保存 PCD 文件?
【发布时间】:2014-07-09 06:02:06
【问题描述】:

前言:我对编码还很陌生。使用 Ubuntu 12.04 和从他们的网站下载的最新 PCL(我相信 PCL 1.7)我已经成功编译并构建了此处列出的 iograbber 程序:http://pointclouds.org/documentation/tutorials/openni_grabber.php

我翻阅了 pointclouds.org 上的教程,其中没有任何内容说明如何添加几行代码以将当前 Kinect 点云保存为 PCD 文件。在“作家”教程中它说

pcl::io::savePCDFileASCII ("test_pcd.pcd", cloud)

但这只是为了保存随机示例点。我想通过按键执行 PCD 保存,例如按空格键。我知道人们以前这样做过,但我找不到示例代码。谁能指出我正确的方向?

【问题讨论】:

    标签: c++ kinect openni point-cloud-library


    【解决方案1】:

    使用相同的教程,可以添加

     void cloud_cb_ (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &cloud)
     {
       if (!viewer.wasStopped())
         viewer.showCloud (cloud);
     }
    

    你之前写的那行,在回调(从抓取器接收点云的函数)中,有以下内容

     void cloud_cb_ (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &cloud)
     {
       if (!viewer.wasStopped()){
         viewer.showCloud (cloud);
         pcl::io::savePCDFile ("test_pcd.pcd", cloud);
       }
     }
    

    此代码应保存您正在可视化的云。如果您没有对点云进行可视化,请发表评论。

    注意:你也可以使用

    pcl::io::savePCDFile ("test_pcd.pcd", cloud, true);
    

    以更快的二进制模式保存(但您可能无法在文本编辑器中读取文件)

    希望对你有帮助

    【讨论】:

    • 你的意思是pcl::io::savePCDFileBinary以二进制模式保存,对吧?
    • @Simson 对不起,我混淆了我使用的函数的名称。我用正确的功能编辑了答案。最后一个值默认为 false,并保存为 ascii,如果为 true,则保存为二进制。
    • 但我如何决定何时它会拯救云?我见过其他示例程序,它通过击键保存它。我该怎么做?
    • 是的,如果您使用 pcl 抓取器或直接使用 openni,您需要绑定密钥回调函数,您可以使用任何 c++ 密钥抓取函数并创建自己的密钥回调函数函数,如果你用 opencv 作为垫子显示它,你可以尝试使用 waitKey 函数(最后一个你可能会看到一个例子here。希望它有帮助,如果没有打开一个新问题,我会回答更多示例和更完整的。
    • @Shashwat 您可以在每次创建图像时创建一个 pcd 文件,但请注意...这将大大降低 FPS,因为它必须将其写入硬盘驱动器。我建议将其保存在内存中,然后保存到磁盘(如果您的内存足够大)或仅保存图像(深度和 rgb),然后将它们合并到一个 pcd 文件中。
    【解决方案2】:

    对于任何从事 ROS 工作的人来说,这是一个理想的解决方案。所以我将解决方案分为两部分 - 第一,将其存储为 ROS bag 文件(用于存储来自 ros 主题的任何类型数据的便捷工具),第二,将 rosbag 文件写入 pcd 文件。现在这真的很简单。

    (参考:http://wiki.ros.org/Bags

    A) 将数据存储在 BAG 文件中。 (ROS文件类型)

    首先将数据(可以存储任何类型的数据)存储为ROSBAG。 ROSBAG 只记录来自主题的数据。

    1.要开始使用kinect,打开终端并运行

     $roslaunch kinect2_bridge kinect2_bridge.launch publish_tf:=true
    

    这将使 ROS 系统开始从 kinect 获取数据。您应该会看到系统以“等待客户端连接”启动和停止。

    2.要查看点云,请打开一个新终端。运行

    $ rosrun kinect2_viewer kinect2_viewer sd cloud
    

    然后您将看到一个带有点云视图的新窗口弹出。这里是解释kinect2_viewer函数参数的链接:https://github.com/code-iai/iai_kinect2/tree/master/kinect2_viewer

    3.要记录数据,在新的终端运行

    $ rosbag record -O pcl_sample1.bag -a 
    

    这里的“-a”表示您将订阅所有可用的 ros 主题并从中记录数据。在您认为数据足够之后,您可以通过 ctrl-C 停止它。数据将存储在 .bag 文件中,此处为 name.bag。更多设置可以在这里找到:http://wiki.ros.org/rosbag/Commandline#record

    现在拔下 kinect。 bag 文件包含通过启动 kinect2_bridge 运行的所有主题的数据。现在您可以像实际插入 kinect 一样使用来自主题的数据。

    4.要回放数据,你需要在第一个终端(启动文件)中停止程序。然后你运行

    $ roscore
    

    这将启动一个 ROS 服务器。然后在另一个终端中,运行

    1. 播放包文件:

      $ rosbag play pcl_sample1.bag

    这将使 ROS 系统播放您刚刚记录的数据,就好像设备仍在工作一样。然后您可以使用 kinect2_viewer 查看数据,即:

    1. 运行 Kinect 实际插入的任何命令。

      $ rosrun kinect2_viewer kinect2_viewer sd cloud

    注意:如果您想记录特定主题,请访问http://wiki.ros.org/Bags

    B) 将 BAG 转换为 PCD 文件:(现在只是一个命令。)

    将适当的主题写入相应的文件夹:

    rosrun pcl_ros bag_to_pcd pcl_sample1.bag /kinect2/sd/image_color_rect src/
    
    rosrun pcl_ros bag_to_pcd pcl_sample1.bag /kinect2/sd/image_depth_rect src/PCD\ Files/
    

    【讨论】:

    • 这个解决方案工作正常,但是如何将它集成到启动文件中?
    【解决方案3】:

    我有同样的问题,但我有一个解决方案。

    在这段代码中:

         void cloud_cb_ (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &cloud)
     {
       if (!viewer.wasStopped())
         viewer.showCloud (cloud);
     }
    

    你必须添加这一行

    pcl::io::savePCDFileASCII ("test_pcd.pcd", *cloud);
    

    喜欢这个

     void cloud_cb_ (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &cloud)
     {
       if (!viewer.wasStopped())
       {
           viewer.showCloud (cloud);
           pcl::io::savePCDFileASCII ("test_pcd.pcd", *cloud);
       }
     }
    

    它会减慢.exe,但你可以尝试将这条线放在程序的其他部分

    【讨论】:

      猜你喜欢
      • 2018-04-14
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 2015-06-24
      • 2015-08-19
      • 2019-08-27
      相关资源
      最近更新 更多