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

转:https://blog.csdn.net/bflong/article/details/79137692

参照:https://blog.csdn.net/imsaws/article/details/15500903

一、环境 
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);

 

posted on 2019-06-15 15:57  心灵智者AI  阅读(1200)  评论(0编辑  收藏  举报