pcl1.12+vtk9.1显示点云QVTKOpenGLNativeWidget

这篇博客介绍了如何在pcl1.12版本下,结合vtk9.1重新编译的QVTKOpenGLNativeWidget,在Qt环境中成功展示点云数据的过程。文章提到,由于旧的显示组件不适用,因此需要采用新的创建方法来实现点云的显示。

显示点云 pcl1.12 allone 存在的 vtk 没有 能在qt 中显示的组件  

QVTKOpenGLNativeWidget

重新编译vtk9.1源码后,生成了 QVTKOpenGLNativeWidget

创建显示组件的方法与之前的创建的方法不一样. 

PCLViewer::PCLViewer(int win_size, QWidget *parent) : QVTKOpenGLNativeWidget(parent)
{
#if VTK_MAJOR_VERSION > 8
  auto renderer2 = vtkSmartPointer<vtkRenderer>::New();
  auto renderWindow2 = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
  renderWindow2->AddRenderer(renderer2);
  viewer.reset(new pcl::visualization::PCLVisualizer(renderer2, renderWindow2, "viewer", false));
  this->setRenderWindow(viewer->getRenderWindow());
  viewer->setupInteractor(this->interactor(), this->renderWindow());
#else
  viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false));
  this->SetRenderWindow(viewer->getRenderWindow());
  viewer->setupInteractor(this->GetInteractor(), this->GetRenderWindow());
#endif
#ifndef PCLViewer_H
#define PCLViewer_H

// Point Cloud Library
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>

// Visualization Toolkit (VTK)
#include <vtkRenderWindow.h>
#include <QVTKRenderWidget.h>
#include <QVTKOpenGLNativeWidget.h>

#include  <vtkPolyVertex.h>
#include <vtkTransformPolyDataFilter.h>
#include <vtkPolyDataMapper.h>
#include <vtkOrientationMarkerWidget.h>
#include <vtkArrowSource.h>
#include <vtkRenderer.h>
#include <vtkSmartPointer.h>
#include <vtkTextActor.h>
#include <vtkTextProperty.h>
#include <vtkCubeAxesActor.h>
#include <vtkDoubleArray.h>
#include <vtkLine.h>
#include <vtkAxesActor.h>

#include <vtkWin32RenderWindowInteractor.h>
#include <vtkEventQtSlotConnect.h>
#include <vtkTransform.h>

#include <vtkChartXY.h>
#include <vtkContextScene.h>
#include <vtkContextView.h>
#include <vtkFloatArray.h>
#include <vtkPlotPoints.h>
#include <vtkTable.h>
#include <vtkAxis.h>

#include <vtkPen.h>
#include <vtkBrush.h>
#include <vtkTooltipItem.h>


typedef pcl::PointXYZRGBA       PointT;
typedef pcl::PointCloud<PointT> PointCloudT;

//点云数据
typedef struct vtkpointcloud{
    float x;
    float y;
    float z;
    unsigned int red;
    unsigned int green;
    unsigned int blue;
}VTK_POINT_CLOUD_S;

class PCLViewer : public QVTKOpenGLNativeWidget
{
    Q_OBJECT
public:
    explicit PCLViewer(int win_size,QWidget *parent = nullptr);

    ~PCLViewer();

protected:
    void addOrientationMarkerWidgetAxesToview(vtkRenderWindowInteractor* interactor, double x, double y, double x_wide, double y_wide);

private:
    pcl::visualization::PCLVisualizer::Ptr viewer;
    PointCloudT::Ptr                       cloud;
    vtkSmartPointer<vtkOrientationMarkerWidget> axes_widget_member_;
    unsigned int red;
    unsigned int green;
    unsigned int blue;
};
#endif // PCLViewer_H
#include "PCLViewer.h"
#include <qpainter.h>
#include <qdebug.h>
#include <pcl/common/io.h>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/obj_io.h>
#include <pcl/PolygonMesh.h>
#include <pcl/point_cloud.h>
#include <pcl/io/vtk_lib_io.h>          //loadPolygonFileOBJ所属头文件;
#include <pcl/visualization/pcl_visualizer.h>
#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>
#include <pcl/io/ply_io.h>
#include "vtkGenericOpenGLRenderWindow.h"


typedef pcl::PointXYZRGBA PointT;
typedef pcl::PointCloud<PointT> PointCloudT;

PCLViewer::PCLViewer(int win_size, QWidget *parent) : QVTKOpenGLNativeWidget(parent)
{
#if VTK_MAJOR_VERSION > 8
  auto renderer2 = vtkSmartPointer<vtkRenderer>::New();
  auto renderWindow2 = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
  renderWindow2->AddRenderer(renderer2);
  viewer.reset(new pcl::visualization::PCLVisualizer(renderer2, renderWindow2, "viewer", false));
  this->setRenderWindow(viewer->getRenderWindow());
  viewer->setupInteractor(this->interactor(), this->renderWindow());
#else
  viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false));
  this->SetRenderWindow(viewer->getRenderWindow());
  viewer->setupInteractor(this->GetInteractor(), this->GetRenderWindow());
#endif

  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);

   // Fill in the cloud data
   cloud->width  = 200;
   cloud->height = 1;
   cloud->points.resize (cloud->width * cloud->height);

   for (std::size_t i = 0; i < cloud->size (); ++i)
   {
     (*cloud)[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
     (*cloud)[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
     (*cloud)[i].z = 1024 * rand () / (RAND_MAX + 1.0f);
   }

    viewer->addPointCloud (cloud, "cloud");

    // 如果point 有变动 使用 _viewer->updatePointCloud(_cloud, _poindCloudID);

    // 显示结果图
    viewer->setBackgroundColor (0, 0, 0); //设置背景

    /*添加坐标轴到视图的左下角*/
    axes_widget_member_ = NULL;
    addOrientationMarkerWidgetAxesToview(viewer->getRenderWindow()->GetInteractor(), 0.0, 0.0, 0.20, 0.2);

    viewer->resetCamera ();
    update ();
}

PCLViewer::~PCLViewer()
{
}

void PCLViewer::addOrientationMarkerWidgetAxesToview(vtkRenderWindowInteractor* interactor, double x, double y, double x_wide, double y_wide)
{
    if (axes_widget_member_ == NULL)
    {
            vtkSmartPointer<vtkAxesActor> axes = vtkSmartPointer<vtkAxesActor>::New();

            axes_widget_member_ = vtkSmartPointer<vtkOrientationMarkerWidget>::New();
            axes->SetPosition(0, 0, 0);
            axes->SetTotalLength(2, 2, 2);
            axes->SetShaftType(0);
            axes->GetZAxisShaftProperty()->SetColor(0,0,200);

            axes->SetCylinderRadius(0.02);
            axes_widget_member_->SetOrientationMarker(axes);
            axes_widget_member_->SetInteractor(interactor);
            axes_widget_member_->SetViewport(x,y, x_wide, y_wide);
            axes_widget_member_->SetEnabled(true);
            axes_widget_member_->InteractiveOn();
           // axes_widget_member_->InteractiveOff();
    }
    else
    {
            axes_widget_member_->SetEnabled(true);
            pcl::console::print_warn(stderr, "Orientation Widget Axes already exists, just enabling it");
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值