VTK结合QT显示单个和多个点云

我的代码主要时将单个和多个点云使用VTK和QT显示,运用QVTKWidget控件。
显示单个点云
//单个点云可视化
void Visualize(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud2){vtkSmartPointer<vtkPoints> m_points = vtkSmartPointer<vtkPoints>::New();for(int i = 0;i < cloud2->points.size();i++){m_points->InsertNextPoint(cloud2->points[i].x,cloud2->points[i].y,cloud2->points[i].z);}m_points2->DeepCopy(m_points);std::cout << "可视化点云数量cloud2: " << cloud2->points.size() << std::endl;vtkSmartPointer<vtkPolyData> m_data = vtkSmartPointer<vtkPolyData>::New();m_data->SetPoints(m_points);vtkSmartPointer<vtkVertexGlyphFilter> m_vertexGlyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();m_vertexGlyphFilter->SetInputData(m_data);m_vertexGlyphFilter->Update();//数据类型转换物体vtkSmartPointer<vtkPolyDataMapper> m_dataMapper = vtkSmartPointer<vtkPolyDataMapper>::New();m_dataMapper->SetInputData(m_vertexGlyphFilter->GetOutput());m_dataMapper->Update();//演员vtkSmartPointer<vtkActor> m_actor = vtkSmartPointer<vtkActor>::New();//演员手持物体m_actor->SetMapper(m_dataMapper);if(color==1){m_actor->GetProperty()->SetColor(0, 0, 1);}else if(color==0){m_actor->GetProperty()->SetColor(0, 1, 0);}else if (color==2){m_actor->GetProperty()->SetColor(1, 0, 0);}m_actor->GetProperty()->SetAmbient(0.5);m_actor->GetProperty()->SetPointSize(2);//舞台vtkSmartPointer<vtkRenderer> m_renderer = vtkRenderer::New();//    m_renderer->RemoveAllViewProps();//舞台添加演员m_renderer->AddActor(m_actor);m_renderer->SetBackground(0, 0, 0);//设置背景色// 相机m_renderer->GetActiveCamera()->SetPosition(0, 0, 1);m_renderer->GetActiveCamera()->SetFocalPoint(0, 0, 0);m_renderer->GetActiveCamera()->SetViewUp(0, -1, 0);m_renderer->ResetCamera();//窗口vtkSmartPointer<vtkRenderWindow>  m_renderWindow = vtkSmartPointer<vtkRenderWindow>::New();//窗口添加舞台m_renderWindow->AddRenderer(m_renderer);//设置交互vtkSmartPointer<vtkRenderWindowInteractor> m_renderWindowInteractor = pui->qvtkwidget->GetRenderWindow()->GetInteractor();std::cout << "可视化点云数量cloud2: " << cloud2->points.size() << std::endl;vtkSmartPointer<vtkAreaPicker> areaPicker = vtkSmartPointer<vtkAreaPicker>::New();m_renderWindowInteractor->SetPicker(areaPicker);vtkSmartPointer<HighlightInteractorStyle> style = vtkSmartPointer<HighlightInteractorStyle>::New();style->SetPolyData(m_data);style->SetCurrentRenderer(m_renderer);m_renderWindowInteractor->SetInteractorStyle(style);m_renderWindowInteractor->Initialize();m_renderWindowInteractor->SetRenderWindow(m_renderWindow);m_renderWindow->SetInteractor(pui->qvtkwidget->GetInteractor());//放入qtwidgetpui->qvtkwidget->SetRenderWindow(m_renderWindow);pui->qvtkwidget->GetRenderWindow()->Render();m_renderWindowInteractor->Start();}
显示多个点云
//可视化多个点云
void MultVisualize(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud1,pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud2){vtkSmartPointer<vtkPoints> result_points = vtkSmartPointer<vtkPoints>::New();vtkSmartPointer<vtkPoints> source_points = vtkSmartPointer<vtkPoints>::New();for(int i = 0;i < cloud1->points.size();i++){result_points->InsertNextPoint(cloud1->points[i].x,cloud1->points[i].y,cloud1->points[i].z);}for(int i = 0;i < cloud2->points.size();i++){source_points->InsertNextPoint(cloud2->points[i].x,cloud2->points[i].y,cloud2->points[i].z);}std::cout << "点云配准数量cloud_result: " << cloud1->points.size() << std::endl;std::cout << "背景点云数量cloud: " << cloud2->points.size() << std::endl;//设置数据1vtkSmartPointer<vtkPolyData> m_data1 = vtkSmartPointer<vtkPolyData>::New();m_data1->SetPoints(result_points);vtkSmartPointer<vtkVertexGlyphFilter> m_vertexGlyphFilter1 = vtkSmartPointer<vtkVertexGlyphFilter>::New();m_vertexGlyphFilter1->SetInputData(m_data1);m_vertexGlyphFilter1->Update();//设置数据2vtkSmartPointer<vtkPolyData> m_data2 = vtkSmartPointer<vtkPolyData>::New();m_data2->SetPoints(source_points);vtkSmartPointer<vtkVertexGlyphFilter> m_vertexGlyphFilter2 = vtkSmartPointer<vtkVertexGlyphFilter>::New();m_vertexGlyphFilter2->SetInputData(m_data2);m_vertexGlyphFilter2->Update();//数据类型转换物体1vtkSmartPointer<vtkPolyDataMapper> m_dataMapper1 = vtkSmartPointer<vtkPolyDataMapper>::New();m_dataMapper1->SetInputData(m_vertexGlyphFilter1->GetOutput());m_dataMapper1->Update();//数据类型转换物体2vtkSmartPointer<vtkPolyDataMapper> m_dataMapper2 = vtkSmartPointer<vtkPolyDataMapper>::New();m_dataMapper2->SetInputData(m_vertexGlyphFilter2->GetOutput());m_dataMapper2->Update();//演员1vtkSmartPointer<vtkActor> m_actor1 = vtkSmartPointer<vtkActor>::New();//演员1vtkSmartPointer<vtkActor> m_actor2 = vtkSmartPointer<vtkActor>::New();//演员1手持物体1m_actor1->SetMapper(m_dataMapper1);m_actor1->GetProperty()->SetColor(0, 1, 0);m_actor1->GetProperty()->SetAmbient(0.5);m_actor1->GetProperty()->SetPointSize(3);//演员2手持物体2m_actor2->SetMapper(m_dataMapper2);m_actor2->GetProperty()->SetColor(0, 0, 1);m_actor2->GetProperty()->SetAmbient(0.5);m_actor2->GetProperty()->SetPointSize(2);//舞台vtkSmartPointer<vtkRenderer> m_renderer = vtkRenderer::New();//    m_renderer->RemoveAllViewProps();//舞台添加演员m_renderer->AddActor(m_actor1);m_renderer->AddActor(m_actor2);m_renderer->SetBackground(0, 0, 0);//设置背景色//    // 相机//    m_renderer->GetActiveCamera()->SetPosition(0, 0, 1);//    m_renderer->GetActiveCamera()->SetFocalPoint(0, 0, 0);//    m_renderer->GetActiveCamera()->SetViewUp(0, -1, 0);//    m_renderer->ResetCamera();//窗口vtkSmartPointer<vtkRenderWindow>  m_renderWindow = vtkSmartPointer<vtkRenderWindow>::New();//窗口添加舞台m_renderWindow->AddRenderer(m_renderer);m_renderWindow->SetInteractor(pui->qvtkwidget->GetInteractor());//放入qtwidgetpui->qvtkwidget->SetRenderWindow(m_renderWindow);pui->qvtkwidget->GetRenderWindow()->Render();
}

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

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

相关文章

浏览器的使用心得和探索

文章目录 前言一、浏览器二、个人推荐2.1 3602.2 猎豹2.3 火狐2.4 chorme2.5 Opera2.6 QQ浏览器2.7 猫眼&#xff08;Catsxp&#xff09;2.8 edge 三、Browser plugin3.1 AdGuard 广告拦截器3.2 Axure RP 查看器3.3 Edge深度清理者3.4 FeHelper(前端助手)3.5 MarkDownload - Ma…

uniapp——列表分享当前话题(一个页面多个分享)

案例 分享的时候弹出对应的标题和默认第一张图片 代码 <view v-for"(item,index) in list" :key"index"><button open-type"share" :id"index" click.stop"()>{}"><image src"/static/images/cir…

OpenAI推出DALL·E 3识别器、媒体管理器

5月8日&#xff0c;OpenAI在官网宣布&#xff0c;将推出面向其文生图模型DALLE 3 的内容识别器&#xff0c;以及一个媒体管理器。 随着ChatGPT、DALLE 3等生成式AI产品被大量应用在实际业务中&#xff0c;人们越来越难分辨AI和人类创建内容的区别&#xff0c;这个识别器可以帮…

使用API有效率地管理Dynadot域名,设置所有域名默认whois信息

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

电瓶车充电桩:潜藏的暴利行业,简单入门到月入万元!

近几年来&#xff0c;电瓶车凭借其环保、经济特点已成为居民出行的必备工具之一。而促使电瓶车快速普及的原因之一即是电瓶车充电桩的普及。如果留心观察的话&#xff0c;相信大家都可以看出&#xff0c;国内大部分小区都已安装了充电桩设备&#xff0c;电瓶车充电桩已实现了大…

python 字典中按值的大小排序

生成一个随机数d {x:randint(60,100)for x in ABCXYZ} {A: 91, B: 88, C: 100, X: 79, Y: 69, Z: 64} 要求按分数大小排序。 如果我们直接使用sorted(d)就会发现排序的结果是按健排序 [A, B, C, X, Y, Z] 方法一、是使用zip函数把数据转成元组&#xff08;91,A&#xff0…

AI中转计费平台系统源码

AI中转计费平台系统源码 源码免费下载地址抄笔记 (chaobiji.cn)

软件开发的 20 条基本原则:LoD、SoC、SOLID 等

Introduction 介绍 Software design principles are the foundation of software development. As a software engineer, you can find them in your work tools, languages, frameworks, paradigms, and patterns. They are the core pillars of “good” and “readable” co…

免费的发票查验接口平台 PHP开发示例

信息爆炸的时代&#xff0c;发票管理工作也在不断走向数字化管理。传统手动录入的方式不仅耗时长&#xff0c;繁琐低效&#xff0c;且容易出现人为错漏的风险&#xff0c;让财务工作者头疼不已。人工智能时代&#xff0c;翔云推出了发票识别发票查验接口&#xff0c;以此来助力…

测试人员在面试时的注意事项

一、技术方面面试 在某种程度上来说&#xff0c;技术面试重要到能够决定你是否被聘用。在技术岗位方面&#xff0c;在个人品德没有问题的前提下&#xff0c;招聘公司对技术是最关心的。 我现在并不能给你分析具体的面试题&#xff0c;因为与笔试题相比&#xff0c;面试题千变万…

做抖音小店怎么选品?这几种实用性选品方式,新手一看就会

大家好&#xff0c;我是电商笨笨熊 做抖音小店&#xff0c;最重要的是选品&#xff0c;最让玩家头疼的还是选品。 选品该怎么选才能选中爆品&#xff0c;怎么做才能让店铺爆单&#xff1f; 笨笨熊做抖店已经四年多的时间&#xff0c;因此也总结出来一套最适合新手玩家去做的…

Linux i2c工具——i2c_tools

1 简介 i2c-tools是一个用于处理I2C&#xff08;Inter-Integrated Circuit&#xff09;总线的工具集&#xff0c;它在Linux环境中广泛使用。这个工具集包含了一系列命令行工具&#xff0c;用于在I2C总线上执行各种操作&#xff0c;例如扫描设备、读取/写入寄存器、检测设备等。…

redis 缓存一致性,缓存穿透,缓存雪崩,缓存击穿

1.缓存一致性&#xff1a; 缓存一致性就是通过各种方法保证缓存与数据库信息一种&#xff0c;其中最多的办法就是想尽一切办法对过期key进行清除&#xff0c;以保证redis和数据库信息一只&#xff0c;其中就包括了这篇文章中提到的内存淘汰策略&#xff0c;过期key的清除等等&…

STC15W1K16S和VC6.0串口通讯收发测试实例

/********************************************* STC USB 串口板 2014 4 7 20:12 发送接收数据 使用STC串口调试助手通讯正常&#xff0c;L161 **********************************************/ #include "reg51.h" #include "intrins.h" #define…

【设计模式】——专栏概述

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

python文本转语音

python文本转语音 pyttsx3库介绍效果代码 pyttsx3库介绍 pyttsx3 是一个文本到语音转换&#xff08;Text-to-Speech, TTS&#xff09;的 Python 库。它提供了一个跨平台的接口&#xff0c;可以在 Windows、macOS 和 Linux 等操作系统上运行。pyttsx3 的主要功能是允许 Python …

工厂车间冷风机降温通风措施

冷风机的工作原理主要基于蒸发冷却原理&#xff0c;以下是其具体的工作流程&#xff1a; 空气吸入&#xff1a;当冷风机开始工作时&#xff0c;首先通过风扇将车间内的热空气吸入冷风机的机体内。蒸发冷却&#xff1a;冷风机内部有一个或多个湿帘或水帘&#xff0c;当热空气通…

Android手机应用开发工程师应届生学习大纲

一、学习目标 本学习大纲旨在帮助应届毕业大学生系统学习Android应用开发&#xff0c;从基础到进阶&#xff0c;掌握app制作的各个环节&#xff0c;并熟悉实际工作中常用的工具和技术。 二、学习内容 Android基础 Android系统架构介绍Android开发环境搭建&#xff08;JDK、A…

Sylar C++高性能服务器学习记录09 【协程调度模块-知识储备篇】

早在19年5月就在某站上看到sylar的视频了&#xff0c;一直认为这是一个非常不错的视频&#xff0c;由于本人一直是自学编程&#xff0c;基础不扎实&#xff0c;也没有任何人的督促&#xff0c;没能坚持下去&#xff0c;每每想起倍感惋惜。恰逢互联网寒冬&#xff0c;在家无事&a…

【挑战30天首通《谷粒商城》】-【第一天】03、简介-分布式基础概念

文章目录 课程介绍 ( 本章了解即可&#xff0c;可以略过)1、微服务简而言之: 2、集群&分布式&节点2.1、定义2.2、示例 3、远程调用4、负载均衡常见的负裁均衡算法: 5、服务注册/发现&注册中心6、配置中心7、服务熔断&服务降级7.1、服务熔断7.2、服务降级 8、AP…