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

2万+

被折叠的 条评论
为什么被折叠?



