(九)QVTKOpenGLNativeWidget同时显示点云和模型

news2024/10/5 13:59:42

一、加载点云

    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);   //创建点云指针
    QString fileName = QFileDialog::getOpenFileName(this, "Open PointCloud", ".", "Open PCD files(*.pcd)");
    if(fileName == "") return;
    pcl::io::loadPCDFile(fileName.toStdString(),*cloud);
    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    vtkSmartPointer<vtkCellArray> vertices  = vtkSmartPointer<vtkCellArray>::New();

    for (int i = 0; i<cloud->size(); i++)
    {
        vtkIdType pid[1];
        pid[0] =  points->InsertNextPoint(cloud->at(i).x, cloud->at(i).y, cloud->at(i).z);
        vertices->InsertNextCell(1, pid);
    }

    vtkSmartPointer<vtkPolyData> polyData = vtkPolyData::New();
    polyData->SetPoints(points);
    polyData->SetVerts(vertices);

    //映射
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkPolyDataMapper::New();
    mapper->SetInputData(polyData);
    //演员
    vtkSmartPointer<vtkActor> actor = vtkActor::New();
    actor->SetMapper(mapper);
    actor->GetProperty()->SetColor(1.0, 0.0, 0.0);
    actor->GetProperty()->SetPointSize(2);
    renderer->AddActor(actor);

    renderer->ResetCamera();

二、加载obj文件模型

    //读取 OBJ 文件
    vtkSmartPointer<vtkOBJReader> OBJReader = vtkSmartPointer<vtkOBJReader>::New();
    QString fileName = QFileDialog::getOpenFileName(this, "Open OBJ", ".", "Open PCD files(*.obj)");
    if(fileName == "") return;
    OBJReader->SetFileName(fileName.toStdString().c_str());
    OBJReader->Update();
    // 创建映射器和演员
    vtkSmartPointer<vtkPolyDataMapper> mapperOBJ = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapperOBJ->SetInputConnection(OBJReader->GetOutputPort());
    vtkSmartPointer<vtkActor> actorOBJ = vtkSmartPointer<vtkActor>::New();
    actorOBJ->SetMapper(mapperOBJ);
    // 添加演员到渲染器
    renderer->AddActor(actorOBJ);
    renderer->ResetCamera();

三、加载stl文件模型

    //读取 STL 文件
    vtkSmartPointer<vtkSTLReader> STLReader = vtkSmartPointer<vtkSTLReader>::New();
    QString fileName = QFileDialog::getOpenFileName(this, "Open STL", ".", "Open PCD files(*.stl)");
    if(fileName == "") return;
    STLReader->SetFileName(fileName.toStdString().c_str());
    STLReader->Update();
    // 创建映射器和演员
    vtkSmartPointer<vtkPolyDataMapper> mapperSTL = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapperSTL->SetInputConnection(STLReader->GetOutputPort());
    vtkSmartPointer<vtkActor> actorSTL = vtkSmartPointer<vtkActor>::New();
    actorSTL->SetMapper(mapperSTL);
    // 添加演员到渲染器
    renderer->AddActor(actorSTL);
    renderer->ResetCamera();

四、全部代码

.pro

#-------------------------------------------------
#
# Project created by QtCreator 2023-10-23T11:32:27
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = vtk_pointCloud_obj
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += \
        main.cpp \
        widget.cpp

HEADERS += \
        widget.h

FORMS += \
        widget.ui

INCLUDEPATH += /usr/include/eigen3

INCLUDEPATH += /usr/local/include/vtk-8.2
LIBS += /usr/local/lib/libvtk*.so

INCLUDEPATH += /usr/local/include/pcl-1.13
LIBS += /usr/local/lib/libpcl_*.so

main..cpp

#include "widget.h"
#include <QApplication>
#include <QSurfaceFormat>
#include "QVTKOpenGLNativeWidget.h"

int main(int argc, char *argv[])
{
    QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

.ui

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "vtkAutoInit.h"   // vtk初始化的方式
VTK_MODULE_INIT(vtkRenderingOpenGL2);   // 渲染
VTK_MODULE_INIT(vtkInteractionStyle);   // 相互做用方式
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);  //
VTK_MODULE_INIT(vtkRenderingFreeType);
#include <pcl/io/pcd_io.h>
#include <vtkSmartPointer.h>
#include <vtkGenericOpenGLRenderWindow.h>
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkRenderer.h"
#include "vtkActor.h"
#include "vtkProperty.h"
#include "vtkConeSource.h"
#include <vtkSTLReader.h>
#include <vtkOBJReader.h>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_load_pointCould_clicked();

    void on_load_obj_clicked();

    void on_load_stl_clicked();

private:
    Ui::Widget *ui;

    vtkSmartPointer<vtkRenderer> renderer;//渲染器

};

#endif // WIDGET_H

 widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QFileDialog>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    renderer = vtkSmartPointer<vtkRenderer>::New();

    vtkNew<vtkGenericOpenGLRenderWindow> renwindow;
    renwindow->AddRenderer(renderer);
    ui->vtk_widget->SetRenderWindow(renwindow.Get());
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_load_pointCould_clicked()
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);   //创建点云指针
    QString fileName = QFileDialog::getOpenFileName(this, "Open PointCloud", ".", "Open PCD files(*.pcd)");
    if(fileName == "") return;
    pcl::io::loadPCDFile(fileName.toStdString(),*cloud);//"/home/li/pcd/bun_zipper.pcd"
    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    vtkSmartPointer<vtkCellArray> vertices  = vtkSmartPointer<vtkCellArray>::New();

    for (int i = 0; i<cloud->size(); i++)
    {
        vtkIdType pid[1];
        pid[0] =  points->InsertNextPoint(cloud->at(i).x, cloud->at(i).y, cloud->at(i).z);
        vertices->InsertNextCell(1, pid);
    }

    vtkSmartPointer<vtkPolyData> polyData = vtkPolyData::New();
    polyData->SetPoints(points);
    polyData->SetVerts(vertices);

    //映射
    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkPolyDataMapper::New();
    mapper->SetInputData(polyData);
    //演员
    vtkSmartPointer<vtkActor> actor = vtkActor::New();
    actor->SetMapper(mapper);
    actor->GetProperty()->SetColor(1.0, 0.0, 0.0);
    actor->GetProperty()->SetPointSize(2);
    renderer->AddActor(actor);

    renderer->ResetCamera();
}

void Widget::on_load_obj_clicked()
{
    //读取 OBJ 文件
    vtkSmartPointer<vtkOBJReader> OBJReader = vtkSmartPointer<vtkOBJReader>::New();
    QString fileName = QFileDialog::getOpenFileName(this, "Open OBJ", ".", "Open PCD files(*.obj)");
    if(fileName == "") return;
    OBJReader->SetFileName(fileName.toStdString().c_str()); //"/home/li/pcd/RedLeaf.obj"
    OBJReader->Update();
    // 创建映射器和演员
    vtkSmartPointer<vtkPolyDataMapper> mapperOBJ = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapperOBJ->SetInputConnection(OBJReader->GetOutputPort());
    vtkSmartPointer<vtkActor> actorOBJ = vtkSmartPointer<vtkActor>::New();
    actorOBJ->SetMapper(mapperOBJ);
    // 添加演员到渲染器
    renderer->AddActor(actorOBJ);
    renderer->ResetCamera();
}

void Widget::on_load_stl_clicked()
{
    //读取 STL 文件
    vtkSmartPointer<vtkSTLReader> STLReader = vtkSmartPointer<vtkSTLReader>::New();
    QString fileName = QFileDialog::getOpenFileName(this, "Open STL", ".", "Open PCD files(*.stl)");
    if(fileName == "") return;
    STLReader->SetFileName(fileName.toStdString().c_str()); //"/home/li/pcd/skull_50.stl"
    STLReader->Update();
    // 创建映射器和演员
    vtkSmartPointer<vtkPolyDataMapper> mapperSTL = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapperSTL->SetInputConnection(STLReader->GetOutputPort());
    vtkSmartPointer<vtkActor> actorSTL = vtkSmartPointer<vtkActor>::New();
    actorSTL->SetMapper(mapperSTL);
    // 添加演员到渲染器
    renderer->AddActor(actorSTL);
    renderer->ResetCamera();
    ui->vtk_widget->update();
}

 效果展示

五、3d模型下载网址

 专业版 3D 模型 :: TurboSquid

有个问题:在槽函数中显示点云和模型,加载出来之后,需要点击一下界面才能显示出来,如果全部写在构造函数中就可以直接全部显示出来。我把能加的update函数都试了一遍,都不管用。想的是如果知道点击界面时的源码,执行了什么函数,就可以解决差问题了。如果有知道的朋友一定要留言告知呀,万分感谢!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1127383.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle 中 group by 的使用需要注意的地方

1.业务场景 需要将2023年1-12月的数据全部查出&#xff0c;并以行的形式呈现。这里要用到行转列的思路&#xff0c;我采用的是简单的case when函数。 2.group by 的使用方法 WHERE xxx1xx AND xxx2yy group by (除聚合函数以外的所有字段)举个例子&#xff1a; select stud…

alpha shape 2D点集边缘线提取

Delaunay三角网 alpha shape 2D点集边缘线提取 Delaunay三角网 参考blog: Scipy 笔记 [Geometry] Alpha Shapes - 原理及我的实现Alpha Shape Widyaningrum E , Peters R Y , Lindenbergh R C . Building outline extraction from als point clouds using medial axis transfo…

MATLAB——一维离散小波的单层分解

%% 学习目标&#xff1a;一维离散小波的单层分解 %% clear all; close all; load noissin.mat; [cA,cD]dwt(noissin,sym4); %% cA是近似系数&#xff08;低频部分&#xff09;&#xff0c;cD是细节系数&#xff08;高频部分&#xff09;&#xff0c;采用的小波是sym4 f…

2023.10.22 关于 定时器(Timer) 详解

目录 引言 标准库定时器使用 自己实现定时器的代码 模拟实现的两大方面 核心思路 重点理解 自己实现的定时器代码最终代码版本 引言 定时器用于在 预定的时间间隔之后 执行特定的任务或操作 实例理解&#xff1a; 在服务器开发中&#xff0c;客户端向服务器发送请求&#…

Banana Pi BPI-W3(Armsom W3)RK3588开当板之调试UART

前言 本文主要讲解如何关于RK3588开发板UART的使用和调试方法&#xff0c;包括UART作为普通串口和控制台两种不同使用场景 一. 功能特点 Rockchip UART (Universal Asynchronous Receiver/Transmitter) 基于16550A串口标准&#xff0c;完整模块支持以下功能&#xff1a; 支…

【T+】畅捷通T+增加会计科目提示执行超时已过期。

【问题描述】 在畅捷通T软件中&#xff0c; 增加会计科目的时候提示&#xff1a; 通过DataTable插入ext扩展表出错:执行超时已过期。 完成操作之前已超时或服务器未响应。 操作已被用户取消。 语句已终止。 【解决方法】 【方法一】 注销用户登录&#xff0c;回到软件登录界面…

linux入门---多线程的理解

目录标题 线程的认识线程的管理进程和线程的区别为什么要有多线程线程的特性多线程的创建和证明线程特性的补充线程的优点线程的缺点线程的健壮性问题clone函数 线程的认识 在之前的学习中我们知道当一个程序加载进物理内存的时候操作系统会为该程序创建对应的PCB&#xff0c;…

11 Fork/Join

1 分治思想 分治思想&#xff1a;规模为N的问题分解为K个规模的子问题&#xff0c;子问题相互独立且与原问题性质相同&#xff0c;求出子问题的解&#xff0c;就能得到原问题的解 分治思想的步骤&#xff1a; 分解 求解 合并 2 Fork/Join 2.1 介绍 并行计算框架&#xff0c;用…

ROCESS SPID 代表什么进程

ROCESS 发出sql命令 所在主机的进程 可以不在数据库主机上发出 SPID 对应数据库的服务进程id select a.PROCESS,b.SPID From v$session a , v$process b where a.PADDRb.ADDR and a.USERNAMESYS SQL> !ps -ef|grep sqlplus oracle 385 2792 0 21:01 pts/…

继电器测试的方法和步骤有哪些?

继电器测试是一种常见的电气测试方法&#xff0c;用于检测继电器的工作状态和性能&#xff0c;下面是继电器测试的一般方法和步骤&#xff1a; 准备工作&#xff1a;确认测试设备的准备情况&#xff0c;包括测试仪器、电源、继电器和连接线等。确认继电器的工作原理和参数&…

IDEA: 个人主题及字体搭配推荐

文章目录 1. 字体设置推荐2. 主题推荐3. Rainbow Brackets(彩虹括号)4. 设置背景图片 下面是我的 IDEA 主题和字体&#xff0c;它们的搭配效果如下&#xff1a; 1. 字体设置推荐 在使用 IntelliJ IDEA 进行编码和开发时&#xff0c;一个合适的字体设置可以提高你的工作效率和舒…

Spring 最全Bean的加载和获取方式整理

目录 一、 前言二、Bean加载的九种方式1. XML配置方式2. XML注解配置方式3. 注解方式4. 使用Bean方式5. 使用Import方式6. 容器初始化完毕后注入bean7. 实现ImportSelector接口8. 实现ImportBeanDefinitionRegistrar接口9. 实现BeanDefinitionRegistryPostProcessor接口 三、Be…

Verilog功能模块——读写位宽不同的异步FIFO

前言 前面的博文已经讲了异步FIFO和同步FIFO&#xff0c;但并没有实现FIFO的读写位宽转换功能&#xff0c;此功能是FIFO的主要功能之一&#xff0c;应用十分广泛&#xff0c;因此&#xff0c;在前面两个模块的基础上&#xff0c;本文使用纯Verilog实现了读写位宽不同的FIFO&…

Plex踩坑——plex web无法找到媒体服务器

现象&#xff1a;之前安装过plex server&#xff0c;然后卸载了。再次重装后&#xff0c;plex web无法找到媒体服务器。 原因&#xff1a;卸载plex server时需要手动将plex的注册表删除&#xff1a;HKEY_CURRENT_USER\Software\Plex, Inc. 原文链接Uninstall Plex Media Serve…

又是一年1024,你还在做程序猿嘛

每年的10月24日&#xff0c;对于广大程序员来说&#xff0c;都有着特殊的意义。这一天是程序员节&#xff0c;一个属于这个独特群体的庆祝活动。在这个特别的日子里&#xff0c;我们不禁要问&#xff1a;又是一年1024&#xff0c;你还在做程序猿嘛&#xff1f; 程序员&#xff…

MATLAB——一维连续小波的分解

%% 学习目标&#xff1a;一维连续小波的分解 %% help wavelet 查询小波工具箱中的所有函数 %% wavedemo 查看案例 clear all; close all; load noissin.mat; %% which noissin.mat figure; subplot(211); plot(noissin); %信号的时域图 10…

【xxl-job】你与xxl-job仅差这个示例

文章目录 摘要介绍底层使用技术和实现原理分布式任务调度任务执行器分片任务任务调度中心 示例代码详解创建一个任务处理类补充配置文件启动xxl-job执行器&#xff0c;并在任务调度中心中添加一个定时任务在任务调度中心中添加一个定时任务&#xff0c;并选择刚刚创建的任务处理…

只要路由器有WPS按钮,佳能打印机连接到Wi-Fi网络的方法就很简单

佳能打印机是很好的设备&#xff0c;可以让你从智能手机、电脑或平板电脑打印照片。它们还提供其他功能&#xff0c;如扫描文档和复制图像。 最新的型号还允许你连接到Wi-Fi&#xff0c;因此你不需要使用电线将设备连接到打印机。 Wi-Fi是通过本地网络传输数据的标准方式。它…

rstudio server 服务器卡死了怎么办

#rstudio 卡死了怎么办 cd ~/.local/share/ ls rm -fr rstudio.old mv ~/.rstudio ~/.rstudio.oldcd ~/.config/ rm -fr .rstudio.old mv ~/.config/rstudio/ ~/.config/rstudio.oldps -ef|grep t040413 |grep rsession |awk {print $2}| xargs kill -9

itbuilder软件在线设计数据库模型,AI与数据库擦出的火花

今天要介绍一款强大的软件&#xff0c;它就是itBuilder软件&#xff0c;一款在线设计数据库模型软件&#xff0c;借助人工智能提高效率&#xff0c;可以生成CRUD代码并推送至开发工具中&#xff1b;它涵盖了几乎所有语言&#xff0c;如Java、Python、JavaScript等&#xff0c;并…