当前位置: 首页 > article >正文

PCL点云开发-解决在Qt中嵌入点云窗口出现的一闪而过的黑窗口

PCL点云开发-解决在Qt中嵌入点云窗口出现的一闪而过的黑窗口

众所周知,在windows下开发PCL点云最快的方式就是到官网下载其预编译好的库,比如:
PCL-1.14.0-AllInOne-msvc2022-win64.exe

这时候你到网络上搜索,大概率会有两种方案:
1、等PCL创建好窗口后,拿到该窗口的句柄,使用Qt的API将其嵌入到QWidget中,这就是为什么会出现一闪而过的黑窗口的原因
2、重新编译VTK以及PCL库,打开Qt支持模块,在Qt中将QOpenGLWidget提升为PCLQVTKWidget

喜欢偷懒的程序员怎么可能会去编译源码呢,绝不可能😂,那就研究下第一种方案如何解决一闪而过的黑窗口。
按照这种思路思考,第一种方案是不是在其创建RenderWindow的时候不显示窗口,等其嵌入Qt控件的时候显示就可以了。是的就是这么简单,怎么做呢?打开格局就可以了,格局如下:

#include <pcl/visualization/pcl_visualizer.h>
#include <vtkRenderer.h>

#include <QApplication>
#include <QMainWindow>
#include <QWindow>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    pcl::visualization::PCLVisualizer::Ptr viewer;
    // 创建渲染器
    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    // 创建渲染窗口
    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    // 设置渲染窗口不显示
    renderWindow->SetShowWindow(false);
    // 构造PCLVisualizer
    viewer.reset(new pcl::visualization::PCLVisualizer(renderer, renderWindow, "viewer", true));

	// 将renderWindow的嵌入到QWidget中
    auto viewerWinId = QWindow::fromWinId((WId)renderWindow->GetGenericWindowId());
    auto widget = QWidget::createWindowContainer(viewerWinId, nullptr);
    widget->show();

    // 添加点云
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
    cloud->resize(500);
    for (auto &point : *cloud) {
        point.x = 1024 * rand() / (RAND_MAX + 1.0f);
        point.y = 1024 * rand() / (RAND_MAX + 1.0f);
        point.z = 1024 * rand() / (RAND_MAX + 1.0f);

        point.r = 255 * (1024 * rand() / (RAND_MAX + 1.0f));
        point.g = 255 * (1024 * rand() / (RAND_MAX + 1.0f));
        point.b = 255 * (1024 * rand() / (RAND_MAX + 1.0f));
    }
    viewer->addPointCloud(cloud, "cloud");
    return a.exec();
}

效果如下:
在这里插入图片描述


http://www.kler.cn/a/399927.html

相关文章:

  • leetcode-44-通配符匹配
  • oracle19c开机自启动
  • 【unity小技巧】一些unity3D灯光的使用与渲染及性能优化方案
  • 《Spring 基础之 IoC 与 DI 入门指南》
  • Linux下编译MFEM
  • 解决 IDEA 修改代码重启不生效的问题
  • 2024RISC-V中国峰会 演讲幻灯片和视频回放公开
  • 跨平台编译Go程序:GOOS和GOARCH环境变量的使用
  • 儿童玩具常用的语音ic芯片类别?
  • DNS原理详解,DNS解析过程
  • Python函数——函数的传入参数
  • HTTP/3 深入解读:现代互联网的加速引擎
  • WEB攻防-通用漏洞SQL注入Tamper脚本Base64Jsonmd5等
  • OceanBase 闪回查询
  • 国标GB28181视频平台EasyCVR视频融合平台H.265/H.264转码业务流程
  • FPGA开发流程
  • 企业组网面临的安全挑战及SD-WAN解决方案
  • [产品管理-89]:《产品思维30讲》的主要内容与核心思想,产品的本质是利用各种工具和思维模式,为用户和社会创造真正解决问题和满足需求的价值
  • OLED透明屏在零售行业有哪些优势
  • 【vba源码】导入excel批注信息
  • IDEA 2024.3正式版发布,速览新功能!
  • 51c自动驾驶~合集27
  • 华为刷题笔记--题目索引
  • MySQL查询执行(七):临时表
  • 掌握docker部署Spring boot项目演示
  • 强制放大缩小(适用于所有ctrl-,ctrl+)