自学内容网 自学内容网

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();
}

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


原文地址:https://blog.csdn.net/fenjiehuang/article/details/143864466

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!