PCL点云处理可视化——法向显示错误“no override found for vtk actor”解决方法

一、环境
Win10 X64
VS2015
PCL1.8.0AllinOne

二、代码

#include "stdafx.h"
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/features/normal_3d.h>
#include <pcl/surface/gp3.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/pcd_io.h>
#include <pcl/features/integral_image_normal.h>
#include <boost/thread/thread.hpp>
#include <pcl/visualization/pcl_visualizer.h>


int main(int argc, char** argv)
{
    //加载点云模型
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    // pcl::PCLPointCloud2 cloud_blob;
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("rabbit.pcd", *cloud) == -1) {

        PCL_ERROR("Could not read file \n");
    }
    //* the data should be available in cloud

    // Normal estimation*
    //法向计算
    pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;
    pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
    //建立kdtree来进行近邻点集搜索
    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
    //为kdtree添加点云数据
    tree->setInputCloud(cloud);

    n.setInputCloud(cloud);
    n.setSearchMethod(tree);
    //点云法向计算时,需要搜索的近邻点大小
    n.setKSearch(20);
    //开始进行法向计算
    n.compute(*normals);
    //* normals should not contain the point normals + surface curvatures

    // Concatenate the XYZ and normal fields*
    //将点云数据与法向信息拼接
    pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);
    pcl::concatenateFields(*cloud, *normals, *cloud_with_normals);

    /*图形显示模块*/
    //显示设置
    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));

    //设置背景色
    viewer->setBackgroundColor(0, 0, 0.7);

    //设置点云颜色,该处为单一颜色设置
    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, 1, "sample cloud");

    //添加需要显示的点云法向。cloud为原始点云模型,normal为法向信息,10表示需要显示法向的点云间隔,即每10个点显示一次法向,5表示法向长度。
    //viewer->addPointCloudNormals<pcl::PointXYZ, pcl::Normal>(cloud, normals, 1, 0.01, "normals");
    viewer->addPointCloudNormals<pcl::PointNormal>(cloud_with_normals, 10, 0.5, "normals");
    //--------------------
    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);
        boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    }

    // Finish
    return (0);
}

三、错误描述
这里写图片描述
这里写图片描述
这里写图片描述

四、解决方法
添加如下代码

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);

参考VTK6 error: no override found for

点云数据平滑拟合是一种重要的点云处理方法,可以减少噪声和不规则形状的影响,提取出点云数据中的主要特征。而基于b样条曲线的方法就是其中一种常用的平滑拟合方法。 在点云数据平滑拟合中,基于b样条曲线的方法通过将点云数据分段连接,使用多个b样条曲线来逼近原始数据点的形状。首先,需要将点云数据按照一定的规则划分为多个小段,每个小段内的点云数据数量不宜过多。接下来,通过在每个小段上建立b样条曲线,并拟合该部分点云数据。 基于b样条曲线的方法点云数据平滑拟合中的优势主要体现在以下几个方面: 1. 高度拟合精度:b样条曲线是一种高阶曲线拟合方法,可以更好地逼近原始数据。通过调整b样条的控制点和权重,可以使得曲线更贴近点云数据的实际形状。 2. 平滑性:b样条曲线对于原始数据中的噪声和不规则形状具有较好的平滑性。拟合后的曲线能够保持原始数据的主要特征,并抑制孤立的噪声点。 3. 参数化表示:b样条曲线具有参数化的特点,可以通过调整参数控制整个曲线的形状。这使得在处理点云数据时可以对曲线进行灵活的调整,以获取更好的平滑效果。 需要注意的是,基于b样条曲线的点云数据平滑拟合方法虽然具有较好的效果,但也存在一定的局限性。例如,在处理大规模点云数据时可能会遇到较大的计算量和内存占用问题。此外,需要对b样条曲线的参数进行合理选择和调整,以获得更好的拟合结果。因此,在应用该方法时需要综合考虑实际需求和计算资源的限制。
评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值