臨沂網(wǎng)站建設(shè)設(shè)計(jì)百度識(shí)圖網(wǎng)站
PCL點(diǎn)云開(kāi)發(fā)-解決在Qt中嵌入點(diǎn)云窗口出現(xiàn)的一閃而過(guò)的黑窗口
眾所周知,在windows下開(kāi)發(fā)PCL點(diǎn)云最快的方式就是到官網(wǎng)下載其預(yù)編譯好的庫(kù),比如:
PCL-1.14.0-AllInOne-msvc2022-win64.exe
這時(shí)候你到網(wǎng)絡(luò)上搜索,大概率會(huì)有兩種方案:
1、等PCL創(chuàng)建好窗口后,拿到該窗口的句柄,使用Qt的API將其嵌入到QWidget中,這就是為什么會(huì)出現(xiàn)一閃而過(guò)的黑窗口的原因
2、重新編譯VTK以及PCL庫(kù),打開(kāi)Qt支持模塊,在Qt中將QOpenGLWidget提升為PCLQVTKWidget
喜歡偷懶的程序員怎么可能會(huì)去編譯源碼呢,絕不可能😂,那就研究下第一種方案如何解決一閃而過(guò)的黑窗口。
按照這種思路思考,第一種方案是不是在其創(chuàng)建RenderWindow的時(shí)候不顯示窗口,等其嵌入Qt控件的時(shí)候顯示就可以了。是的就是這么簡(jiǎn)單,怎么做呢?打開(kāi)格局就可以了,格局如下:
#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;// 創(chuàng)建渲染器vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();// 創(chuàng)建渲染窗口vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();// 設(shè)置渲染窗口不顯示renderWindow->SetShowWindow(false);// 構(gòu)造PCLVisualizerviewer.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();// 添加點(diǎn)云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();
}
效果如下: