PCL VTK在Qt窗口显示

这是在ubuntu18测试通过的,奇怪的是在win10下却无法运行
.pro片段

PCL_DIR=/usr/local/pcl-1.9.1
VTK_DIR=/usr/local/vtk8.1.1

INCLUDEPATH += \
    $${PCL_DIR}/include/pcl-1.9 \
    $${VTK_DIR}/include/vtk-8.1 \
    /usr/include/eigen3



LIBS += \
    /usr/lib/x86_64-linux-gnu/libboost_*.so \
    $${PCL_DIR}/lib/*.so.1.9 \
    $${VTK_DIR}/lib/libvtk*.so


main.cpp

#include <QApplication>

#include "MainWindow.h"


#include <vtkAutoInit.h>
#if  VTK_MAJOR_VERSION >=7
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
VTK_MODULE_INIT(vtkRenderingFreeType)
#endif

#include <QVTKOpenGLWidget.h>
#include <vtkOpenGLRenderWindow.h>



int
main(int argc, char *argv[])
{
    QApplication a(argc, argv);


    /*
     * when set 0 -- > disable multisampling, have serration.
     * QVTKOpenGLWidget need
     */
    //vtkOpenGLRenderWindow::SetGlobalMaximumNumberOfMultiSamples(8);
    //QSurfaceFormat::setDefaultFormat(QVTKOpenGLWidget::defaultFormat());

    // to fix:
    // qt.glx: qglx_findConfig: Failed to finding matching FBConfig (1 1 1 1)
    QSurfaceFormat fmt;
    fmt.setVersion(3, 0);
    QSurfaceFormat::setDefaultFormat(fmt);

    MainWindow w;
    w.show();

    return a.exec();
}

.h

#ifndef PCLWIDGET_H
#define PCLWIDGET_H

#include <QVTKOpenGLWidget.h>
#include <vtkRenderer.h>
#include <vtkGenericOpenGLRenderWindow.h>

#include <pcl/visualization/pcl_visualizer.h>



class PCLWidget : public QVTKOpenGLWidget
{
    Q_OBJECT
public:
    explicit PCLWidget(QWidget* parent = nullptr);
    ~PCLWidget();



private:
    void init_widget();
    void add_point_cloud();


private:
    vtkSmartPointer<vtkRenderer> d_ren;
    vtkSmartPointer<vtkGenericOpenGLRenderWindow> d_ren_win;


    pcl::visualization::PCLVisualizer* d_pcl_view;


};

#endif // PCLWIDGET_H

.cpp

#include "PCLWidget.h"

#define random(x1,x2) ((rand()%x2) - x1/2.0)


PCLWidget::PCLWidget(QWidget* parent)
    : QVTKOpenGLWidget(parent),
      d_ren(nullptr)
{
    init_widget();
    add_point_cloud();
}



PCLWidget::~PCLWidget()
{
    if(d_ren)
    {
        d_ren->RemoveAllViewProps();
        d_ren->Delete();
        d_ren = nullptr;
    }
}



void
PCLWidget::init_widget()
{
    d_ren = vtkRenderer::New();
    d_ren->SetBackground2 ( 0.56, 0.65, 0.9 );//light blue
    d_ren->SetBackground ( 0.96, 0.96, 0.96 );//#f5f5f5
    d_ren->SetGradientBackground(true);

    //d_ren->SetBackground(1.0, 1.0, 1.0);

    d_ren_win = vtkGenericOpenGLRenderWindow::New();
    d_ren_win->AddRenderer(d_ren);
    SetRenderWindow(d_ren_win);


    d_pcl_view = new pcl::visualization::PCLVisualizer(d_ren, d_ren_win, "PCL", false);
    d_pcl_view->setupInteractor(GetInteractor(), d_ren_win);
}



void
PCLWidget::add_point_cloud()
{
    pcl::PointXYZ p;


    // 设置默认的坐标系
    d_pcl_view->addCoordinateSystem(1.0);
    // 设置固定的元素。红色是X轴,绿色是Y轴,蓝色是Z
    d_pcl_view->addLine(pcl::PointXYZ(0, 0, 0), pcl::PointXYZ(10, 0, 0), "x");
    d_pcl_view->addLine(pcl::PointXYZ(0, 0, 0), pcl::PointXYZ(0, 5, 0), "y");
    d_pcl_view->addLine(pcl::PointXYZ(0, 0, 0), pcl::PointXYZ(0, 0, 2), "z");


    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud = boost::make_shared< pcl::PointCloud<pcl::PointXYZ> >();

    //填充点云并添加
    for (int i = 0; i < 1000; i++)
    {
        p.x = random(0,10);  //0.1--5
        p.y = random(0, 20);
        p.z = random(0, 40);
        cloud->push_back(p);
    }

    d_pcl_view->addPointCloud(cloud,"c1"); //添加特定的点云
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值