精华内容
下载资源
问答
  • 驱动程序是电脑中比较重要的硬件组成部分,如果出现问题,就会影响相应功能的使用,严重可导致电脑瘫痪,如果发现设备管理器中驱动出现黄色感叹号,要及时进行解决,下面我们就看一下Win7设备管理器驱动出现感叹号的...

    驱动程序是电脑中比较重要的硬件组成部分,如果出现问题,就会影响相应功能的使用,严重可导致电脑瘫痪,如果发现设备管理器中驱动出现黄色感叹号,要及时进行解决,下面我们就看一下Win7设备管理器驱动出现感叹号的解决方法。

    1、首先,同时按下Win7键盘上的Win+R快捷键打开电脑的运行窗口,之后在窗口中输入regedit并单击回车,这样就可以打开电脑的注册表编辑器窗口了。

    6dea4fc8507d362f095d9ac2610f628a.png

    2、在打开的注册表编辑器窗口中,依次点击展开左侧菜单中的HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Class \ {4D36E965-E325-11CE-BFC1-08002BE10318},接下来在右侧窗口中找到UpperFilters选项和LowerFilters选项,直接右键点击这两项,将它们删除掉,之后推出注册表窗口即可。

    a86aaf35f2fad2796afd909e2655b47a.png

    以上就是Win7设备管理器驱动出现感叹号的解决方法,比如声卡驱动和网卡驱动,如果出现问题,就听不到声音也连不上网了,很麻烦,所以一旦发现问题,一定要及时解决。

    展开全文
  • 今天小编告诉大家如何处理win7系统设备管理器驱动显示黄色感叹号的问题,可能很多用户都不知道怎么处理win7系统设备管理器驱动显示黄色感叹号的问题,但当我们遇到win7系统设备管理器驱动显示黄色感叹号的问题怎么办...

    今天小编告诉大家如何处理win7系统设备管理器驱动显示黄色感叹号的问题,可能很多用户都不知道怎么处理win7系统设备管理器驱动显示黄色感叹号的问题,但当我们遇到win7系统设备管理器驱动显示黄色感叹号的问题怎么办呢?遇到这种情况不要着急,我们依照  1.首先,咱们同时按下win7旗舰版键盘上的win+R快捷键打开电脑的运行窗口,之后在窗口中输入regedit并单击回车,这样就可以打开电脑的注册表编辑器窗口了。  2.在打开的注册表编辑器窗口中,咱们依次点击展开左侧菜单中的就可以了;还有不会处理win7系统设备管理器驱动显示黄色感叹号问题的朋友,跟着下面的步骤一起学习一下吧。

    1J4096233-0.png  1.首先,咱们同时按下win7旗舰版键盘上的win+R快捷键打开电脑的运行窗口,之后在窗口中输入regedit并单击回车,这样就可以打开电脑的注册表编辑器窗口了。

    2.在打开的注册表编辑器窗口中,咱们依次点击展开左侧菜单中的HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Control Class {4D36E965-E325-11CE-BFC1-08002BE10318},接下来在右侧窗口中找到UpperFilters选项和LowerFilters选项,咱们直接右键点击这两项,将它们删除掉,之后推出注册表窗口即可。

    展开全文
  • PCLVisualizer

    千次阅读 2018-11-11 15:53:00
    PCLVisualizer是PCL的全功能可视化类。虽然使用比CloudViewer更复杂,但功能也更强大,提供了显示法线,绘图形状和多个视口等功能。 本教程将使用代码示例来说明PCLVisualizer的一些功能,从显示单个点云开始。大...

    PCLVisualizer是PCL的全功能可视化类。虽然使用比CloudViewer更复杂,但功能也更强大,提供了显示法线,绘图形状和多个视口等功能。

    本教程将使用代码示例来说明PCLVisualizer的一些功能,从显示单个点云开始。大部分代码示例都是样板文件,用于设置将被可视化的点云。每个样本的相关代码都包含在特定于该样本的函数中。代码如下所示。将其复制保存到文件名为pcl_visualizer_demo.cpp中。

    /* \author Geoffrey Biggs */
    
    
    #include <iostream>
    
    #include <boost/thread/thread.hpp>
    #include <pcl/common/common_headers.h>
    #include <pcl/features/normal_3d.h>
    #include <pcl/io/pcd_io.h>
    #include <pcl/visualization/pcl_visualizer.h>
    #include <pcl/console/parse.h>
    
    // --------------
    // -----Help-----
    // --------------
    void
    printUsage (const char* progName)
    {
      std::cout << "\n\nUsage: "<<progName<<" [options]\n\n"
                << "Options:\n"
                << "-------------------------------------------\n"
                << "-h          this help\n"
                << "-s          Simple visualisation example\n"
                << "-r          RGB colour visualisation example\n"
                << "-c          Custom colour visualisation example\n"
                << "-n          Normals visualisation example\n"
                << "-a          Shapes visualisation example\n"
                << "-v          Viewports example\n"
                << "-i          Interaction Customization example\n"
                << "\n\n";
    }
    
    
    boost::shared_ptr<pcl::visualization::PCLVisualizer> simpleVis (pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)
    {
      // --------------------------------------------
      // -----Open 3D viewer and add point cloud-----
      // --------------------------------------------
      boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
      viewer->setBackgroundColor (0, 0, 0);
      viewer->addPointCloud<pcl::PointXYZ> (cloud, "sample cloud");
      viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
      viewer->addCoordinateSystem (1.0);
      viewer->initCameraParameters ();
      return (viewer);
    }
    
    
    boost::shared_ptr<pcl::visualization::PCLVisualizer> rgbVis (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)
    {
      // --------------------------------------------
      // -----Open 3D viewer and add point cloud-----
      // --------------------------------------------
      boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
      viewer->setBackgroundColor (0, 0, 0);
      pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
      viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud");
      viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
      viewer->addCoordinateSystem (1.0);
      viewer->initCameraParameters ();
      return (viewer);
    }
    
    
    boost::shared_ptr<pcl::visualization::PCLVisualizer> customColourVis (pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)
    {
      // --------------------------------------------
      // -----Open 3D viewer and add point cloud-----
      // --------------------------------------------
      boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
      viewer->setBackgroundColor (0, 0, 0);
      pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);
      viewer->addPointCloud<pcl::PointXYZ> (cloud, single_color, "sample cloud");
      viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
      viewer->addCoordinateSystem (1.0);
      viewer->initCameraParameters ();
      return (viewer);
    }
    
    
    boost::shared_ptr<pcl::visualization::PCLVisualizer> normalsVis (
        pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals)
    {
      // --------------------------------------------------------
      // -----Open 3D viewer and add point cloud and normals-----
      // --------------------------------------------------------
      boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
      viewer->setBackgroundColor (0, 0, 0);
      pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
      viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud");
      viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
      viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals, 10, 0.05, "normals");
      viewer->addCoordinateSystem (1.0);
      viewer->initCameraParameters ();
      return (viewer);
    }
    
    
    boost::shared_ptr<pcl::visualization::PCLVisualizer> shapesVis (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)
    {
      // --------------------------------------------
      // -----Open 3D viewer and add point cloud-----
      // --------------------------------------------
      boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
      viewer->setBackgroundColor (0, 0, 0);
      pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
      viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud");
      viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
      viewer->addCoordinateSystem (1.0);
      viewer->initCameraParameters ();
    
      //------------------------------------
      //-----Add shapes at cloud points-----
      //------------------------------------
      viewer->addLine<pcl::PointXYZRGB> (cloud->points[0],
                                        cloud->points[cloud->size() - 1], "line");
      viewer->addSphere (cloud->points[0], 0.2, 0.5, 0.5, 0.0, "sphere");
    
      //---------------------------------------
      //-----Add shapes at other locations-----
      //---------------------------------------
      pcl::ModelCoefficients coeffs;
      coeffs.values.push_back (0.0);
      coeffs.values.push_back (0.0);
      coeffs.values.push_back (1.0);
      coeffs.values.push_back (0.0);
      viewer->addPlane (coeffs, "plane");
      coeffs.values.clear ();
      coeffs.values.push_back (0.3);
      coeffs.values.push_back (0.3);
      coeffs.values.push_back (0.0);
      coeffs.values.push_back (0.0);
      coeffs.values.push_back (1.0);
      coeffs.values.push_back (0.0);
      coeffs.values.push_back (5.0);
      viewer->addCone (coeffs, "cone");
    
      return (viewer);
    }
    
    
    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewportsVis (
        pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals1, pcl::PointCloud<pcl::Normal>::ConstPtr normals2)
    {
      // --------------------------------------------------------
      // -----Open 3D viewer and add point cloud and normals-----
      // --------------------------------------------------------
      boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
      viewer->initCameraParameters ();
    
      int v1(0);
      viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
      viewer->setBackgroundColor (0, 0, 0, v1);
      viewer->addText("Radius: 0.01", 10, 10, "v1 text", v1);
      pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
      viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud1", v1);
    
      int v2(0);
      viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);
      viewer->setBackgroundColor (0.3, 0.3, 0.3, v2);
      viewer->addText("Radius: 0.1", 10, 10, "v2 text", v2);
      pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> single_color(cloud, 0, 255, 0);
      viewer->addPointCloud<pcl::PointXYZRGB> (cloud, single_color, "sample cloud2", v2);
    
      viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud1");
      viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud2");
      viewer->addCoordinateSystem (1.0);
    
      viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals1, 10, 0.05, "normals1", v1);
      viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals2, 10, 0.05, "normals2", v2);
    
      return (viewer);
    }
    
    
    unsigned int text_id = 0;
    void keyboardEventOccurred (const pcl::visualization::KeyboardEvent &event,
                                void* viewer_void)
    {
      pcl::visualization::PCLVisualizer *viewer = static_cast<pcl::visualization::PCLVisualizer *> (viewer_void);
      if (event.getKeySym () == "r" && event.keyDown ())
      {
        std::cout << "r was pressed => removing all text" << std::endl;
    
        char str[512];
        for (unsigned int i = 0; i < text_id; ++i)
        {
          sprintf (str, "text#%03d", i);
          viewer->removeShape (str);
        }
        text_id = 0;
      }
    }
    
    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)
      {
        std::cout << "Left mouse button released at position (" << event.getX () << ", " << event.getY () << ")" << std::endl;
    
        char str[512];
        sprintf (str, "text#%03d", text_id ++);
        viewer->addText ("clicked here", event.getX (), event.getY (), str);
      }
    }
    
    boost::shared_ptr<pcl::visualization::PCLVisualizer> interactionCustomizationVis ()
    {
      boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
      viewer->setBackgroundColor (0, 0, 0);
      viewer->addCoordinateSystem (1.0);
    
      viewer->registerKeyboardCallback (keyboardEventOccurred, (void*)viewer.get ());
      viewer->registerMouseCallback (mouseEventOccurred, (void*)viewer.get ());
    
      return (viewer);
    }
    
    
    // --------------
    // -----Main-----
    // --------------
    int
    main (int argc, char** argv)
    {
      // --------------------------------------
      // -----Parse Command Line Arguments-----
      // --------------------------------------
      if (pcl::console::find_argument (argc, argv, "-h") >= 0)
      {
        printUsage (argv[0]);
        return 0;
      }
      bool simple(false), rgb(false), custom_c(false), normals(false),
        shapes(false), viewports(false), interaction_customization(false);
      if (pcl::console::find_argument (argc, argv, "-s") >= 0)
      {
        simple = true;
        std::cout << "Simple visualisation example\n";
      }
      else if (pcl::console::find_argument (argc, argv, "-c") >= 0)
      {
        custom_c = true;
        std::cout << "Custom colour visualisation example\n";
      }
      else if (pcl::console::find_argument (argc, argv, "-r") >= 0)
      {
        rgb = true;
        std::cout << "RGB colour visualisation example\n";
      }
      else if (pcl::console::find_argument (argc, argv, "-n") >= 0)
      {
        normals = true;
        std::cout << "Normals visualisation example\n";
      }
      else if (pcl::console::find_argument (argc, argv, "-a") >= 0)
      {
        shapes = true;
        std::cout << "Shapes visualisation example\n";
      }
      else if (pcl::console::find_argument (argc, argv, "-v") >= 0)
      {
        viewports = true;
        std::cout << "Viewports example\n";
      }
      else if (pcl::console::find_argument (argc, argv, "-i") >= 0)
      {
        interaction_customization = true;
        std::cout << "Interaction Customization example\n";
      }
      else
      {
        printUsage (argv[0]);
        return 0;
      }
    
      // ------------------------------------
      // -----Create example point cloud-----
      // ------------------------------------
      pcl::PointCloud<pcl::PointXYZ>::Ptr basic_cloud_ptr (new pcl::PointCloud<pcl::PointXYZ>);
      pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZRGB>);
      std::cout << "Genarating example point clouds.\n\n";
      // We're going to make an ellipse extruded along the z-axis. The colour for
      // the XYZRGB cloud will gradually go from red to green to blue.
      uint8_t r(255), g(15), b(15);
      for (float z(-1.0); z <= 1.0; z += 0.05)
      {
        for (float angle(0.0); angle <= 360.0; angle += 5.0)
        {
          pcl::PointXYZ basic_point;
          basic_point.x = 0.5 * cosf (pcl::deg2rad(angle));
          basic_point.y = sinf (pcl::deg2rad(angle));
          basic_point.z = z;
          basic_cloud_ptr->points.push_back(basic_point);
    
          pcl::PointXYZRGB point;
          point.x = basic_point.x;
          point.y = basic_point.y;
          point.z = basic_point.z;
          uint32_t rgb = (static_cast<uint32_t>(r) << 16 |
                  static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));
          point.rgb = *reinterpret_cast<float*>(&rgb);
          point_cloud_ptr->points.push_back (point);
        }
        if (z < 0.0)
        {
          r -= 12;
          g += 12;
        }
        else
        {
          g -= 12;
          b += 12;
        }
      }
      basic_cloud_ptr->width = (int) basic_cloud_ptr->points.size ();
      basic_cloud_ptr->height = 1;
      point_cloud_ptr->width = (int) point_cloud_ptr->points.size ();
      point_cloud_ptr->height = 1;
    
      // ----------------------------------------------------------------
      // -----Calculate surface normals with a search radius of 0.05-----
      // ----------------------------------------------------------------
      pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> ne;
      ne.setInputCloud (point_cloud_ptr);
      pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZRGB> ());
      ne.setSearchMethod (tree);
      pcl::PointCloud<pcl::Normal>::Ptr cloud_normals1 (new pcl::PointCloud<pcl::Normal>);
      ne.setRadiusSearch (0.05);
      ne.compute (*cloud_normals1);
    
      // ---------------------------------------------------------------
      // -----Calculate surface normals with a search radius of 0.1-----
      // ---------------------------------------------------------------
      pcl::PointCloud<pcl::Normal>::Ptr cloud_normals2 (new pcl::PointCloud<pcl::Normal>);
      ne.setRadiusSearch (0.1);
      ne.compute (*cloud_normals2);
    
      boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;
      if (simple)
      {
        viewer = simpleVis(basic_cloud_ptr);
      }
      else if (rgb)
      {
        viewer = rgbVis(point_cloud_ptr);
      }
      else if (custom_c)
      {
        viewer = customColourVis(basic_cloud_ptr);
      }
      else if (normals)
      {
        viewer = normalsVis(point_cloud_ptr, cloud_normals2);
      }
      else if (shapes)
      {
        viewer = shapesVis(point_cloud_ptr);
      }
      else if (viewports)
      {
        viewer = viewportsVis(point_cloud_ptr, cloud_normals1, cloud_normals2);
      }
      else if (interaction_customization)
      {
        viewer = interactionCustomizationVis();
      }
    
      //--------------------
      // -----Main loop-----
      //--------------------
      while (!viewer->wasStopped ())
      {
        viewer->spinOnce (100);
        boost::this_thread::sleep (boost::posix_time::microseconds (100000));
      }
    }
    

    #编译和运行程序

    将下面的行添加到您的CMakeLists.txt文件中:

    cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
    
    project(pcl_visualizer_viewports)
    
    find_package(PCL 1.2 REQUIRED)
    
    include_directories(${PCL_INCLUDE_DIRS})
    link_directories(${PCL_LIBRARY_DIRS})
    add_definitions(${PCL_DEFINITIONS})
    
    add_executable (pcl_visualizer_demo pcl_visualizer_demo.cpp)
    target_link_libraries (pcl_visualizer_demo ${PCL_LIBRARIES})
    

    在创建可执行文件之后,可以像这样运行它:

    ./pcl_visualizer_demo -h
    

    更改选项以更改执行的演示。有关详情,请参阅帮助输出。

    要退出查看器应用程序,请按q。按下r可以居中放大查看器,以便可以看到整个云。通过点击和拖动鼠标来旋转视点。您可以使用滚轮,或者右键单击并上下拖动以放大和缩小。中点击并拖动将移动相机。

    #可视化单个云
    本示例使用PCLVisualizer来显示单个PointXYZ云。它还说明改变背景颜色和显示轴。代码在函数simpleVis中。

    _images/pcl_visualizer_simple.png

    说明
    simpleVis函数显示如何执行点云的最基本的可视化。让我们一行一行地看看这个函数。

    ...
    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
    ...
    

    这创建了查看器对象,给它一个不错的名字并显示在标题栏中。我们将它存储在一个boost::shared_ptr中,所以它可以在演示程序中传递。通常情况下,你不需要这样做。

    ...
    viewer->setBackgroundColor (0, 0, 0);
    ...
    

    查看器的背景颜色可以设置为任何你喜欢的RGB颜色。在这种情况下,我们将其设置为黑色。

    ...
    viewer->addPointCloud<pcl::PointXYZ> (cloud, "sample cloud");
    ...
    

    这是最重要的一条线。我们将点云添加到查看器,给它一个ID字符串,可用于识别其他方法的云。多点云可以添加多个呼叫addPointCloud(),每次提供一个新的ID。如果要更新已显示的点云,则必须先调用removePointCloud()并提供要更新的云的ID。(注意:PCL1.1及以上版本提供了一种新的API方法, updatePointCloud()允许在不手动调用removePointCloud()的情况下更新点云。)

    这是addPointCloud()许多变化中最基本的。其他用于处理不同的点类型,显示法线等等。在本教程中,我们将介绍其他一些功能,或者您可以查看PCLVisualizer文档以获取更多详细信息。

    ...
    viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
    ...
    

    改变渲染点的大小。您可以使用此方法控制在查看器中渲染点云的方式。

    ...
    viewer->addCoordinateSystem (1.0);
    ...
    

    查看复杂的点云通常会让人迷失方向。为了让自己与世界保持一致,可以显示轴。这些将沿X(红色),Y(绿色)和Z(蓝色)轴显示为三个圆柱体。可以使用scale参数来控制圆柱体的大小。在这种情况下,我们将其设置为1.0(如果没有给定值,这也是默认值)。这种方法的另一个版本可以用来放置世界上任何一点的坐标轴。

    ...
    viewer->initCameraParameters ();
    ...
    

    This final call sets up some handy camera parameters to make things look nice.

    最后有一段代码与所有样本相关。它可以在示例的底部找到:

    ...
    while (!viewer->wasStopped ())
    {
      viewer->spinOnce (100);
      boost::this_thread::sleep (boost::posix_time::microseconds (100000));
    }
    ...
    

    These lines are running an event loop. Each call to spinOnce gives the viewer time to process events, allowing it to be interactive. There is also a spin method, which only needs to be called once.

    #添加一些颜色
    通常,点云不会使用简单的PointXYZ类型。一个常见的点类型是PointXYZRGB,它也包含颜色数据。除此之外,您可能希望对特定的点云进行着色,以使其在观察者中可以区分。PCLVizualizer提供了用于显示存储在其中的颜色数据或将颜色分配给点云的点云的功能。

    RGB点云
    许多设备(如Microsoft Kinect)都会生成带有RGB数据的点云。PCLVisualizer可以使用这些数据来显示云,为每个点着色。rgbVis函数中的代码显示了如何执行此操作。

    _images / pcl_visualizer_color_rgb.png

    说明
    这个示例中的代码跟早期的示例相比没有太多更改。

    ...
    boost::shared_ptr<pcl::visualization::PCLVisualizer> rgbVis (pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)
    ...
    

    首先,注意点类型已经从简单的例子改变了。我们现在使用的点类型也为RGB数据提供了空间。这个很重要; 没有RGB字段的点(点类型不一定必须PointXYZRGB,只要它有三个颜色字段),PCLVisualizer将不知道使用什么颜色。

    ...
    pcl::visualization::PointCloudColorHandlerRGB<pcl::PointXYZRGB> rgb(point_cloud_ptr);
    ...
    

    接下来,在设置查看器的背景颜色后,我们创建一个颜色处理程序对象。PCLVisualizer使用这样的对象来显示自定义数据。在这种情况下,对象将从每个点获取RGB颜色字段供查看器绘制时使用。存在许多其他处理程序用于广泛的目的。我们将在下一个代码示例中看到另一个颜色处理程序,但处理程序也存在用于从点云中绘制颜色和绘制几何图形等其他字段的目的。详细信息请参阅文档

    ...
    viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud");
    ...
    

    最后,当我们添加点云时,我们在向查看器添加点云时指定颜色处理程序。

    自定义颜色
    第二个代码示例演示给点云一个单一的颜色。我们可以使用这种技术为特定的点云提供自己的颜色,使我们能够区分单个的点云。在这个customColourVis函数中给出的例子中,我们已经将点云的颜色设置为绿色。(我们也增加了点的大小,使颜色更清晰可见。)

    _images/pcl_visualizer_color_custom.png

    说明
    再一次,这个示例中的代码跟早期的示例相比没有太多更改。

    ... 
    boost :: shared_ptr < pcl :: visualization :: PCLVisualizer >  customColourVis  (pcl :: PointCloud < pcl :: PointXYZ > :: ConstPtr  cloud )
    ...
    

    这次使用的点类型再次返回到PointXYZ。为点云设置自定义颜色处理程序时,底层数据类型是什么并不重要。使用自定义颜色处理程序时,没有任何点字段用于颜色。

    ...
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color (cloud, 0, 255, 0);
    ...
    

    我们创建一个自定义颜色处理程序,并为其分配一个漂亮,明亮的绿色色彩。

    ...
    viewer->addPointCloud<pcl::PointXYZ> (cloud, single_color, "sample cloud");
    ...
    

    和前面的例子一样,我们在调用的时候会传递颜色处理函数 addPointCloud<>()

    #法线和其他信息
    显示法线是了解点云的重要一步。PCLVisualizer类可以绘制法线,以及其他有趣的点云信息,例如主曲率和几何图形。

    normalsVis函数中的代码示例显示如何显示点云的法线。计算法线的代码将不会在本教程中解释。有关详细信息,请参阅法线计算教程。

    _images / pcl_visualizer_normals.png

    说明
    相关的代码行放在绘制点云的线后面。

    ...
    viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals, 10, 0.05, "normals");
    ...
    

    一旦你有了法线,在查看器中显示它们只需要一条额外的线。此方法的参数设置要显示的法线数(此处显示每十个法线),以及为每个法线绘制的线的长度(在本例中为0.05)。

    #绘图形状
    PCLVisualizer允许您在视图中绘制各种原始形状。这通常用于可视化点云处理算法的结果,例如,通过在其周围绘制透明球体来可视化将哪些点集群视为地标。

    shapesVis函数中的示例代码演示了向查看器添加形状的一些方法。它增加了四个形状:

    从云中的第一个点到云中的最后一个点的一条线。
    在起源的飞机。
    一个以云中第一个点为中心的球体。
    沿着Y轴的一个锥体。

    _images / pcl_visualizer_shapes.png

    说明
    将点云添加到查看器后,绘制形状的代码示例的相关部分开始。

    ...
    viewer->addLine<pcl::PointXYZRGB> (cloud->points[0], cloud->points[cloud->size() - 1], "line");
    ...
    
    

    这行(代码)从云中的第一个点到最后一个点添加一行(在空间中)。例如,此方法用于显示点云之间的对应关系。在这种情况下,该行使用默认颜色,但也可以指定该行的颜色。从点云的点绘制形状是非常普遍的,并且可以使用各种形状。

    ...
    viewer->addSphere (cloud->points[0], 0.2, 0.5, 0.5, 0.0, "sphere");
    ...
    

    下一行添加了一个以半径为0.2,云中第一个点为中心的球体。它也给球体一个颜色。

    ...
    pcl::ModelCoefficients coeffs;
    coeffs.values.push_back(0.0);
    coeffs.values.push_back(0.0);
    coeffs.values.push_back(1.0);
    coeffs.values.push_back(0.0);
    viewer->addPlane (coeffs, "plane");
    ...
    

    接下来,我们为绘图添加一架平面。在这种情况下,我们使用标准平面方程(ax + by + cz + d = 0)来指定平面。我们的平面将以原点为中心,沿着Z轴定向。许多形状绘制函数以这种方式获取系数。

    ...
    coeffs.values.clear();
    coeffs.values.push_back(0.3);
    coeffs.values.push_back(0.3);
    coeffs.values.push_back(0.0);
    coeffs.values.push_back(0.0);
    coeffs.values.push_back(1.0);
    coeffs.values.push_back(0.0);
    coeffs.values.push_back(5.0);
    viewer->addCone (coeffs, "cone");
    ...
    

    最后,我们添加一个锥体。我们再次使用模型系数来指定锥的参数。

    #Multiple viewports
    您经常需要并排比较多个点云。虽然你可以在同一个视图端口绘制它们,但这可能会让人困惑。PCLVisualizer允许您在单独的视口中绘制多个点云,使比较变得简单。

    viewportsVis函数中的代码使用视口来演示比较为点云计算的法线。计算相同云的两组法线,但使用不同的搜索半径。第一次,搜索半径是0.05。第二次是0.1。0.05半径搜索的法线将显示在黑色背景的视口中。0.1半径搜索的法线将显示在灰色背景的视口中。

    并排比较这两组法线使得立即明白不同算法参数的效果如何。通过这种方式,您可以尝试使用算法的参数来查找良好设置,快速查看结果。

    _images/pcl_visualizer_viewports.png

    说明

    ... 
    boost :: shared_ptr < pcl :: visualization :: PCLVisualizer >  viewer  (new  pcl :: visualization :: PCLVisualizer  (“3D Viewer” )); 
    viewer - > initCameraParameters  (); 
    ...
    

    这是我们创建查看器的标准代码。

    ...
    int v1(0);
    viewer->createViewPort (0.0, 0.0, 0.5, 1.0, v1);
    viewer->setBackgroundColor (0, 0, 0, v1);
    viewer->addText ("Radius: 0.01", 10, 10, "v1 text", v1);
    pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb (cloud);
    viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud1", v1);
    ...
    

    下一步是创建一个新的viewport。这四个参数是X和Y轴上的viewport的最小和最大范围,介于0和1之间。我们正在创建一个viewport,以填充窗口的左半部分。我们必须存储在第五个参数中传回的视口ID号,并将其用于所有其他只影响该viewport的调用。

    我们还设置了这个viewport的背景颜色,根据我们使用viewport区分的内容给它一个标签,并且使用一个RGB颜色处理器来添加我们的点云。

    ...
    viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud1");
    viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud2");
    viewer->addCoordinateSystem (1.0);
    ...
    

    这三行为全部viewport设置了一些属性。大多数PCLVisualizer方法接受可选的viewport ID参数。指定时,它们只影响该viewport。如果不是,就像在这种情况下一样,它们影响所有的viewport。

    ...
    viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals1, 10, 0.05, "normals1", v1);
    viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals2, 10, 0.05, "normals2", v2);
    ...
    

    最后,我们添加法线,每个viewport一个。

    #交互定制
    您有时会觉得默认的鼠标和键绑定提供的交互选项不能满足您的需求,您可能需要扩展功能,例如在按下按钮或注释特定位置时可能保存当前显示的点云用鼠标绘制窗口等等,比如,在这个interactionCustomizationVis方法中可以找到一个非常简单的例子。

    注意
    在Mac平台上,如果使用7.0以前的VTK版本,则需要将可执行文件构建为应用程序包,以便获得适当的鼠标和键盘交互支持。有关如何执行此操作的更多说明,请参阅Cocoa VTK Wiki

    在本教程的这一部分,您将看到如何捕捉鼠标和键盘事件。通过右键单击窗口,将出现一个2D文本,您可以通过按r来删除所有文本实例。结果应该是这样的:

    _images/pcl_visualizer_interaction_customization.png

    说明

    ...
    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
    viewer->initCameraParameters ();
    ...
    

    这是实例化查看器的标准代码。

    ...
    viewer->registerKeyboardCallback (keyboardEventOccurred, (void*)&viewer);
    viewer->registerMouseCallback (mouseEventOccurred, (void*)&viewer);
    ...
    

    这两行代码将分别注册两个方法,keyboardEventOccurred 以及mouseEventOccurred键盘和鼠标事件回调。这两个方法调用的第二个参数是所谓的cookie。这些是您可能要传递给回调函数的任何参数。在我们的情况下,我们想要传递查看器本身,以便在用户交互的情况下对其进行修改。请注意,这些参数必须是单个void*实例的形式 ,所以我们需要将指针指向我们的boost::shared_ptrto void*

    ...
    void mouseEventOccurred (const pcl::visualization::MouseEvent &event,
                        void* viewer_void)
    {
      boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *> (viewer_void);
      if (event.getButton () == pcl::visualization::MouseEvent::LeftButton && event.getType () == pcl::visualization::MouseEvent::MouseButtonRelease)
      {
        std::cout << "Left mouse button released at position (" << event.getX () << ", " << event.getY () << ")" << std::endl;
        char str[512];
    
        sprintf (str, "text#%03d", text_id ++);
        viewer->addText ("clicked here", event.getX (), event.getY (), str);
      }
    }
    ...
    

    这是处理鼠标事件的方法。每当任何一种鼠标事件被注册时,这个函数都会被调用。为了确切地看到事件是什么,我们需要从event实例中提取这些信息。在我们的例子中,我们正在寻找鼠标左键释放。每当发生这种事件时,我们将在鼠标点击的位置写一个小文本。

    ...
    void keyboardEventOccurred (const pcl::visualization::KeyboardEvent &event,
                            void* viewer_void)
    {
      boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *> (viewer_void);
      if (event.getKeySym () == "r" && event.keyDown ())
      {
        std::cout << "r was pressed => removing all text" << std::endl;
    
        char str[512];
        for (unsigned int i = 0; i < text_id; ++i)
        {
          sprintf (str, "text#%03d", i);
          viewer->removeShape (str);
        }
        text_id = 0;
      }
    }
    ...
    

    键盘事件也适用同样的方法。我们检查按下了什么按键,我们所做的动作是删除鼠标点击所创建的所有文本。请注意,当按下r时,3D摄像机仍按照PCLVisualizerr的原始绑定进行重置。所以,我们的键盘事件不会覆盖基类的功能。

    PCLVisualizer

    展开全文
  • PCL学习笔记-PCL简介

    千次阅读 2020-09-15 17:46:25
    PCL(点云库)学习笔记 1.简介 点云数据的处理可以采用获得广泛应用的Point Cloud Library(点云库,PCL库)。 PCL库是一个最初发布于 2013年的开源c++库,它实现了大量点云相关的通用算法和高效的数据管理。支持...

    PCL(点云库)学习笔记

    1.简介
    点云数据的处理可以采用获得广泛应用的Point Cloud Library(点云库,PCL库)。
    PCL库是一个最初发布于 2013年的开源c++库,它实现了大量点云相关的通用算法和高效的数据管理。支持多种操作系统平台,可在Windows、Linux、Android、Mac OS X、部分嵌入式实时系统上运行。
    如果说OpenCV是2D信息获取与处理的技术结晶,那么PCL在3D信息获取与处理上,就与OpenCV具有同等地位,PCL是BSD授权方式,可以免费进行商业和学术应用。

    PCL包含多个模块,如滤波(filter)、特征提取(features)、关键字(keypoint)、配准(registration)、k-d树(k-d tree)、八叉树(octree)、分割(segmentation)、抽样一致(Random sample consensus)、表面重建(surface)、识别(recognition)、输入输出(io)、visualization(可视化)等模块。
    2.PCL的发展与创景
    PCL起初是ROS(Robot Operating System)下由来自于慕尼黑大学和斯坦福大学Radu博士等人维护和开发的开源项目,主要应用于机器人研究应用领域,随着各个算法模块的积累,于2011年独立出来,正式与全球3D信息获取、处理的同行一起,组件了强大的开发维护团队。
    随着加入组织的增多,PCL官方目前的计划是继续加入很多新的功能模块和算法的实现,包括当前最新的3D相关的处理算法,如基于PrimeSensor 3D设备,微软 Kinect或者XTionPRO智能交互应用等,而且也计划进一步支持使用CUDA和OpenCL等基于GPU的高性能计算的技术。
    3.PCL的潜在应用领域
    PCL能解决什么问题?
    机器人领域
    移动机器人对其工作环境的有效感知、辨识与认认知,是其进行自主行为优化 并可靠完成所承担任务的前提和基础。如何实现场景中物体的有效分类与识别是移动机器人场景认知的核心问题,目前基于视觉图像处理技术来进行场景的认知是该领域的重要方法。但移动机器人在线获取的视觉图像质量受光线变化影响较大,特别是在光线较暗的场景更难以应用,随着RGBD获取设备的大量推广,在机器人领域势必掀起一股深度信息结合2D信息的应用研究热潮,深度信息的引入能够使机器人更好的对环境进行认知、辨识,与图像信息在机器人领域的应用一样,需要强大智能软件算法支撑,PCL就为此而生,最重要的是PCL本身就是为机器人而发起的开源项目,PCL中不仅提供了对现有的RGBD信息的 获取设备的支持,还提供了高效的分割、特征提取、识别、追踪等最新的算法,最重要的是它可以移植到android、ubuntu等主流Linux平台上,PCL无疑将会 成为机器人应用领域的一把瑞士军刀。
    CAD/CAM、逆向工程
    大部分工业产品是根据二维或三维CAD模型制造而成,但有时因为数据丢失、设计多次更改、实物引进等原因,产品的几何模型无法获得,因而常常需要根据现有产品实物生成物体几何模型。逆向工程技术能够对产品实物进行测绘,重构产品表面三维几何模型,生成产品制造所需的数字化文档。在一些工业领域,如汽车制造业,许多零件的几何模型都通过逆向工程由油泥模型或实物零件获得,目前在CAD/CAM领域利用激光点云进行高精度测量与重建成为趋势,同时引来了新的问题,通过获取的海量点云数据,来提取重建模型的几何参数,或者形状模型,对模型进行智能检索,从点云数据获取的曲面模型等,诸如此类的问题解决方案在PCL中都有涉及。例如kdtree和octree对海量点云进行高效压缩存储和管理,其中滤波、配准、特征描述与提前基础处理,可应用于模型的智能检索,以及后期的曲面重建和可视化都在PCL中有相应的模块。总之,三维点云数据的处理是逆向工程中比较重要的一环,PCL中间所有的模块正是为此而生。
    激光遥感测量
    能够直接获取高精度三维地面点数据,是对传统测量技术在高程数据获取及自动化快速处理方面的重要技术补充。激光遥感测量系统在地形测绘、环境检测、三维城市建模、地球科学、行星科学等诸多领域具有广泛的发展前景,是目前最先进的能实时获取地形表面三维空间信息和影像的遥感系统。目前,在各种提取地面点的算法中,算法结果与世界结果之间差别较大 ,违背了实际情况,PCL中强大的模块可以助力此处的各种需求。
    虚拟现实 、人机交互
    虚拟现实技术(简称VR),又称灵境技术,是以沉浸性、交互性和构想性为基本特征的计算机高级人机界面。它综合利用了计算机图形学、仿真技术、多媒体技术、人工智能技术、计算机网络技术、并行处理技术和多传感器技术,模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间,具有广阔的应用前景 。目前各种交互式体感应用的推出,让虚拟现实与人机交互发展非常迅速,以微软、华硕、三星等为例,目前诸多公司推出的RGBD解决方案,势必会让虚拟现实走出实验室,因为现有的RGBD设备已经开始大量推向市场,只是缺少,其他应用的跟进,这正是在为虚拟现实和人机交互应用铸造生态链的底部 。
    4.PCL的结构和内容
    如图的架构图所示,对于3D点云处理来说,PCL完全是一个模块化的现代C++模板库。其基于以下第三方库:Boost、Eigen、FLANN、VTK、OpenNI、Qhull,实现点云相关的获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。
    PCL利用OpenMP、GPU、CUDA等先进高性能计算技术,通过并行化提高程序实时性。K近邻搜索操作的架构是基于FLANN(Fast Library for Approximate Nearest Neighbors)所实现的,速度也是目前技术中最快的。PCL中的所有模块和算法都是通过Boost共享指针来传送数据的。因而避免了多次复制系统中已存在的数据的需要,从0.6版本开始,PCL就已经被移入到Windows、MacOS和Linux系统,并且在Android系统也已经开始投入使用,这使得PCL的应用容易移植与多方发布。

    从算法的角度,PCL是指纳入了多种操作点云数据的三维处理算法,其中包括:过滤,特征估计,表面重建,模型拟合和分割,定位搜索等。每一套算法都是通过基类进行划分的,试图把贯穿整个流水线处理技术的所有常见功能整合在一起,从而保持了整个算法实现过程中的紧凑和结构清晰,提高代码的重用性、简洁可读。在PCL中一个处理管道的基本接口程序是:
    创建处理对象:(例如过滤、特征估计、分割等);
    使用setInputCloud通过输入点云数据,处理模块;
    设置算法相关参数;
    调用计算(或过滤、分割等)得到输出。
    为了进一步简化和开发,PCL被分成一系列较小的代码库,使其模块化,以便能够单独编译使用提高可配置性,特别适用于嵌入式处理中:
    Libpcl filter:如采样、去除离群点、特征提取、拟合估计等数据实现过滤器;
    Libpcl features:实现多种三维特征,如曲面法线、曲率、边界点估计、矩不变量、主曲率,PFH和FPFH特征,旋转图像、积分图像,NARF描述子,RIFT,相对标准偏差,数据强度的筛选等等;
    Libpcl I/O:实现数据的输入和输出操作,例如点云数据文件(PCD)的读写;
    Libpcl segmentation:实现聚类提取,如通过采样一致性方法对一系列参数模型(如平面、柱面、球面、直线等)进行模型拟合点云分割提取,提取多边形棱镜内部点云等等;
    Libpcl surface:实现表面重建技术,如网络重建、凸包重建、移动最小二乘法平滑等;
    Libpcl register:实现点云配准方法,如ICP等;
    Libpcl keypoints:实现不同的关键点的提取方法,这可以用来作为预处理步骤,决定在哪儿提取特征描述符;
    Libpcl range:实现支持不同点云数据集生成的范围图像。
    为了保证PCL中操作的正确性,上述提到的库中的方法和类包含了单位和回归测试。这套单元测试通常都是由专门的构建部门按需求编译和验证的。当某一部分测试失败时,这些特定部分的各自作者就会立即被告知。这彻底地保证了代码测试过程出现的任何变故,以及新功能或修改都不会破坏PCL中已经存在的代码。

    展开全文
  • PCL简介

    千次阅读 2016-11-15 20:39:49
    PCL简介  Point Cloud Library (PCL) 是一个独立的大型的处理二维/三维图像和点云数据的开源工程,由Willow Garage公司开发,起初只是以PR2机器人在3D数据感知算法处理上速度更快为目标,后来才渐渐发展为一个独立...
  • PCL学习笔记10 —— PCL滤波

    千次阅读 2018-12-06 17:21:59
    在获取点云数据时 ,由于设备精度,操作者经验环境因素带来的影响,以及电磁波的衍射特性,被测物体表面性质变化和数据拼接配准操作过程的影响,点云数据中讲不可避免的出现一些噪声。在点云处理流程中滤波处理作为...
  • PCL滤波学习

    2019-11-23 16:27:12
    在获取点云数据时 ,由于设备精度,操作者经验环境因素带来的影响,以及电磁波的衍射特性,被测物体表面性质变化和数据拼接配准操作过程的影响,点云数据中讲不可避免的出现一些噪声。在点云处理流程中滤波处理作为...
  • PCL学习

    2012-12-17 15:48:12
    Point cloud library是一个开源、跨平台的点云处理库,pcl框架涵盖了当前最先进的点云处理相关算法,涉及滤波、特征估计、表面重建、注册、模型拟合、分割等。Pcl基于BSD协议,可免费用于商业和研究应用,适用于...
  • PCL被分割成许多模块化库,发布的PCL中最重要的模块如下: 滤波 特征 滤波 背景 下图是一个去噪的例子。由于测量误差,某些数据集会出现大量的阴影点。这使得局部点云三维特征的估计变得复杂。其中...
  • PCLVisualizer可视化类是PCL中功能最全的可视化类,与CloudViewer可视化类相比,PCLVisualizer使用起来更为复杂,但该类具有更全面的功能,如显示法线、绘制多种形状和多个视口。本小节将通过示例代码演示PCL...
  • · 说明 以下均为 Being_young 前辈所写,现转载过来,再...或者参考另一篇博文:[PCL系列——从深度图像(RangeImage)中提取NARF关键点] · 目录索引 PCL 点云特征描述与提取 PCL 描述三维特征相关基础 PCL
  • ubuntu16配置PCL

    2021-01-15 14:42:56
    网上很多教程提到,安装PCL需要预先安装VTK,但是实验室师兄配置环境是直接从源码安装的PCL1.8.1,而我配置的所有设备都需要安装VTK,目前为止还没有找到具体原因,如果有知道的大佬,希望能解答一下疑惑。...
  • PCL 深度图像

    2021-07-07 10:34:45
    PCL 深度图像前言将点云转化为深度图像CodeCMakeLIst.txt 前言 各种光学传感器技术的发展,包含物体三维结构信息的深度图像数据获取开始普及。尤其时kinect等设备的出现。 什么是深度图像? 定义:深度图像(Depth ...
  • pcl_cloudpoint

    2020-09-25 17:26:40
    三维图像是一种特殊的信息表达形式,其特征是表达的空间中三个维度的数据,表现形式包括:深度图(以灰度表达物体与相机的距离),几何模型(由CAD软件建立),点云模型(所有逆向工程设备都将物体采样成点云)。...
  • PCL滤波I

    千次阅读 2017-08-15 16:50:46
    在获取点云数据时 ,由于设备精度,操作者经验环境因素带来的影响,以及电磁波的衍射特性,被测物体表面性质变化和数据拼接配准操作过程的影响,点云数据中讲不可避免的出现一些噪声。在点云处理流程中滤波处理作为...
  • PCL点云滤波去噪

    万次阅读 多人点赞 2019-01-11 13:04:20
    为什么要对点云滤波? 一般下面这几种情况需要进行点云滤波处理: (1) 点云数据密度不规则需要平滑 (2) 因为遮挡等问题造成离群点...不过别担心,PCL中有一个专门的点云滤波模块,可以将噪声点去除,还可以进行...
  • 本文介绍了PCL中的3D特性估计方法,并作为对PCL:: feature类的内部结构感兴趣的用户或开发人员的指南。 理论基础 来自Rusu论文: 在它们的原生表示中,三维映射系统概念中定义的点只是使用它们相对于给定原点的笛卡尔...
  • PCL源码分析】之快速点特征直方图FPFH - pcl::FPFHSignature33 1. pcl::FPFHSignature33介绍 先来看 pcl::FPFHSignature33 的源码: /** \brief A point structure representing the Fast Point Feature ...
  • (注:资料来源:D:\项目资料_YC\激光扫描建模_长沙项目_2016→2019\2017&2018_文档资料_技术总结YC\...本节是对开源点云库PCL的安装、调试过程的总结,内容涵盖以下方面:①安装:VS2010的安装、PCL的安装、Cm...
  • PCL 1.0开始,PCL(三维点云处理库Point Cloud Library)提供了一个通用采集接口,这样可以方便地连接到不同的设备及其驱动、文件格式和其他数据源。PCL集成的第一个数据获取驱动是OpenNI Grabber,它使得从OpenNI...
  • PCL 实战记录 (一)

    千次阅读 2019-11-16 17:03:34
    PCL 实战记录 (一) 在学习、实战过程中,可参考PCL官方文档,链接: PCL官方文档:PCL官方文档链接 1、读取、显示、保存 #include <iostream> #include <pcl/io/ply_io.h> #include <pcl/point_...
  • Point Cloud Library (PCL) 介绍

    千次阅读 2019-10-17 10:52:29
    PCL介绍PCL相关网站什么是PCLPCL的划分PCL模块集FiltersFeaturesKeypointsRegistrationKd-treeOctreeSegmentationSample ConsensusSurfaceRange ImageI/OVisualizationPCL教程基本使用下载PCLUsing prebuilt ...
  • 在Windows平台从源代码编译PCL 本教程解释如何在Microsoft Windows平台上从源代码编译Point Cloud库。在本教程中,我们假设您已经构建并安装了所有必需的依赖项,或者您已经使用下载页面上提供的依赖项安装程序安装...
  • PCL点云库的架构

    2020-03-18 01:09:50
    PCL中所有的处理都是基于点云展开的,利用不同的设备获取点云,存储点云等都是点云处理前后必须做的流程,PCL中有自己设计的内部PCD文件格式,为此,设计读写该格式以及与其他3D文件格式之间进行转化的接口类都是很...
  • PCL点云处理之IO模块

    2018-10-12 11:05:26
    I/O模块中共有21个类,28个函数实现,主要用于点云文件输入输出、支持OpenNI的设备源数据获取接口(多种感知设备获取点云图像数据)、数据存储等功能。 1、pcl::FileReader PCD文件读取 intreadHeader(xxx)...
  • PCL Visualizer可视化类是PCL中功能最全的可视化类,与CloudViewer可视化类相比,PCL Visualizer使用起来更加复杂,但该类具有更全面的功能,如显示法线、绘制多种形状和多个视口。下面的示例代码演示了PCL ...
  • PCL_OpenNI安装

    千次阅读 2014-07-13 14:04:04
    Point Cloud Library (PCL) 是一个独立的大型的处理二维/三维图像和点云数据的开源工程,由Willow Garage公司开发,起初只是以PR2机器人在3D数据感知算法处理上速度更快为目标,后来才渐渐发展为一个独立的函数库。...
  • PCL--滤波

    2019-06-25 19:44:12
       在获取点云数据时,由于设备精度,操作者经验,以及环境因素等带来的影响。点云数据将不可避免的出现一些噪点。    在点云处理流程中滤波处理作为预处理的第一步,往往对后续处理影响很大。 只有在滤波处理...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,701
精华内容 1,080
关键字:

其他设备pcl