这是在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"); //添加特定的点云
}