pcl经典算法60例——(1)打开并显示点云,窗口PCLVisualizer嵌入MFC的picture control

news2024/11/22 4:17:16

一、搭建MFC框架

1、环境说明

本教程为vs2022,pcl1.12.1版本,其他版本自己进行适当修改,仅供参考。

2、方法步骤

(1)新建项目,选择“基于对话框”,然后点击“下一步”

 

二、配置pcl环境

关于配置环境,网上很多教程,本人的“pcl专栏”里面也有详细说明,自己慢慢做,不要着急,最后配置完成后就可以进行下一步了。

PCL 1.12.1库目录、包含目录及输入lib库文件名称详细配置说明_大胡子大叔的博客-CSDN博客

pcl1.12.1重新安装boost库_大胡子大叔的博客-CSDN博客

三、添加picture control和button,显示渐变色点云代码

在窗口中添加picture control,id为“IDC_STATIC”

        网上很多的资料写的都是获取MFC窗口的大小,实际是不对的,如果可着整个MFC窗口绘制picture control
        比例上是可以这么用的,但是我的窗口除了picture control还有很多按钮,占用了MFC的面积
       所以直接用MFC窗口的尺寸是有问题的,尤其是在给窗口分割成好几个窗口的时候,会发现比例是不对的

        GetClientRect(&rect);//实时获取MFC窗口大小

        用下面的这句,就可以获得picture control的尺寸了,窗口分割的时候就不会发生问题了
        GetDlgItem(IDC_STATIC)->GetClientRect(&rect);

 放到头文件里的声明

private:
	boost::shared_ptr<pcl::visualization::PCLVisualizer> m_viewer;//要共享指针类型的,要不然,显示窗口会跳出MFC界面
	vtkRenderWindow* m_win;   //vtk渲染的窗口句柄
	vtkRenderWindowInteractor* m_iren;//vtk交互的对象

 放到cpp文件里的代码,在“BOOL CMFCPCLSHFDlg::OnInitDialog()”里面插入窗口的初始化代码

//==========================将viewer窗口结合到MFC图像控件上===========================

	//显示窗口初始化

	m_viewer.reset(new pcl::visualization::PCLVisualizer("viewer", false));//初始化viewer对象
	//m_viewer->addCoordinateSystem(); //设置对应的坐标系
	m_viewer->setBackgroundColor(0, 0, 0);//设置背景颜色为黑色
	m_viewer->initCameraParameters();//初始化相机的参数
	m_win = m_viewer->getRenderWindow();//将view中的渲染窗口的句柄传递给vtk window
	m_iren = vtkRenderWindowInteractor::New(); //初始化vtkwindow交互的对象 
	m_viewer->resetCamera();//使点云显示在屏幕中间,并绕中心操作
	CRect rect;
	//网上很多的资料写的都是获取MFC窗口的大小,实际是不对的,如果可着整个MFC窗口绘制picture control
	// 比例上是可以这么用的,但是我的窗口除了picture control还有很多按钮,占用了MFC的面积
	// 所以直接用MFC窗口的尺寸是有问题的,尤其是在给窗口分割成好几个窗口的时候,会发现比例是不对的
	//GetClientRect(&rect);//实时获取MFC窗口大小
	//用下面的这句,就可以获得picture control的尺寸了,窗口分割的时候就不会发生问题了
	GetDlgItem(IDC_STATIC)->GetClientRect(&rect);
	m_win->SetSize(rect.right - rect.left, rect.bottom - rect.top);//根据当前窗口的大小设置vtk 窗口的大小
	CWnd* viewer_pcWnd;
	viewer_pcWnd = this->GetDlgItem(IDC_STATIC);//获取对应的wnd
	m_win->SetParentId(viewer_pcWnd->m_hWnd);//设置vtk窗口的句柄
	m_iren->SetRenderWindow(m_win);//将vtk交互对象与vtk window绑定 
	m_viewer->createInteractor();
	m_win->Render();//开始渲染

	vtkOutputWindow::SetGlobalWarningDisplay(0);//不弹出vtkOutputWindow窗口

 上图是本人写的一个pcl的c++框架,第一个“打开点云”按钮就是这样的效果了

button1按钮里面的代码

void CMFCPCLSHFDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	CString strFile = _T("");
	CFileDialog    dlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY, _T("Describe Files (*.pcd)|*.pcd|All Files (*.*)|*.*||"), NULL);
	if (dlgFile.DoModal())
	{
		strFile = dlgFile.GetPathName();
		//Cstring 转string
		CString theCStr;
		std::string STDStr(CW2A(strFile.GetString()));

		pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
		if (pcl::io::loadPCDFile<pcl::PointXYZ>(STDStr, *cloud) == -1)//*打开点云文件
		{
			AfxMessageBox(_T("读入点云数据失败"));
		}
		m_viewer->removeAllPointClouds();//将前一次点云移除  
		// 设置单一颜色
		//pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color_h(pcd_src, 0, 255, 0);//点云为绿色
		//按照z方向深度进行渲染(带渐变色)
		pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> color_h(cloud, "z");
		m_viewer->addPointCloud<pcl::PointXYZ >(cloud, color_h, "sample cloud");
		m_viewer->addText("show cloud", 0, 20);

	}
}

如果有帮助到你点个赞吧!


------------------------------------------------------------

声明 | 未经允许,禁止转载!

作者 | 大胡子大叔

出品 | CSDN

-------------------------------------------------------------

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

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

相关文章

centos安装常见软件

安装git # 方式一&#xff1a;yum install git -y# 方式二&#xff1a;&#xff08;开发会用的软件&#xff09;yum -y groupinstall "Development tools"# 执行下面这条yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel…

点云实战及Python路径实验

点云实战 文章目录 点云实战python 有关路径实验下一级目录上一级目录 学习PointNet论文&#xff08;https://arxiv.org/abs/1612.00593&#xff09;并实践 python .\show_seg.py --dataset ../data/shapenet --model .\seg\seg_model_Chair_2.pth python 有关路径实验 下一级…

kotlin Flow系列之 - 冷流SafefFlow源码解析之 - Safe在那里?

本文涉及源码基于kotlinx-coroutines-core-jvm:1.7.1 kotlin 协成系列文章: 你真的了解kotlin中协程的suspendCoroutine原理吗? Kotlin Channel系列&#xff08;一&#xff09;之读懂Channel每一行源码 kotlin Flow系列之-SharedFlow源码解析 kotlin Flow系列之-StateFlow源码…

【java】隐藏手机号中间四位

String phone "12334543437";phone phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");System.out.println(phone);

Mycat【什么是Mycat、Mycat与其他中间件区别、Mycat应用场景、核心概念详解、Mycat原理】(一)-全面详解(学习总结---从入门到深化)

目录 Mycat概述_什么是Mycat Mycat概述_Mycat与其他中间件区别 Mycat概述_Mycat应用场景 Mycat概念_核心概念详解 Mycat概述_Mycat原理 Mycat部署安装_MySQL主从复制概述 Mycat概述_什么是Mycat 什么是Mycat Mycat是数据库中间件&#xff0c;所谓中间件数据库中间件是连…

CentOS详细安装教程

文章目录 前言一、下载所需版本的 CentOS二、创建虚拟机三、安装 CentOS 前言 本文在虚拟机上安装 CentOS Linux release 7.6.1810 版本的操作系统&#xff0c;仅作为安装记录。 一、下载所需版本的 CentOS 1、进入 CentOS 官网&#xff1a;https://www.centos.org/download/…

React类组件

1. React组件 将页面按照界面功能进行拆分&#xff0c;每一块界面都拥有自己的独立逻辑&#xff0c;这样可以提高项目代码的可维护性。其中React组件分为两种&#xff0c;一种是类式组件&#xff0c;一种是函数式组件。这里我们将的是比较常用的类式组件&#xff0c;但是在后续…

《安全软件开发框架(SSDF) 1.1:降低软件漏洞风险的建议》解读(六)

安全软件开发框架SSDF是由美国国家标准与技术研究院发布的关于安全软件开发的一组实践&#xff0c;帮助开发组织减少发布的软件中的漏洞数量&#xff0c;减少利用未检测到或未解决的漏洞的潜在影响&#xff0c;从根本上解决漏洞防止再次发生。本文根据《Secure Software Develo…

dedecms后台数据库备份迁移流程

dedecms网站正常使用需要两部分,网站文件和数据库.两者缺一不可. dedecms上传网站文件后,还要导入数据库,如果您只有网站后台备份,没有其他格式sql备份文件,请按照下面流程重装dedecms,并操作恢复数据库 . 需要选确定/wwwroot/data/backupdata/下是否有对应备份 如不存在备份…

机器学习面试题 - 模型评估2

目录标题 8、为什么在一些场景中要使用余弦相似度而不是欧氏距离&#xff1f;9、余弦距离是否是一个严格定义的距离?10、在对模型进行过充分的离线评估之后&#xff0c;为什么还要进行在线A/B测试&#xff1f;11、如何进行线上A/B测试&#xff1f;12、如何划分实验组和对照组1…

ChatGPT落地场景探索-数据库与大模型

目录 openGauss介绍 openGauss介绍 数据库与大模型 openGauss介绍 大模型与数据库 大模型为数据库带来的机遇 大模型解决数据库问题的挑战 数据库为大模型带来的价值 大模型大模型的发展趋势 趋势产品&#xff1a;Chat2DB 简介 特性 生产应用&#xff1a;基…

运输层:TCP超时重传时间的选择

1.运输层&#xff1a;TCP超时重传时间的选择 笔记来源&#xff1a; 湖科大教书匠&#xff1a;TCP超时重传时间的选择 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 若将超时重传时间RTO < \lt < 报文段0的往返时间RTT0&#xff0c;则会出现…

ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、农业、大气等领域数据分析

查看原文>>> ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、农业、大气等领域数据分析 【内容简述】&#xff1a; 注&#xff1a;请提前自行配置上课环境 【其它相关推荐】&#xff1a; GEE遥感云大数据林业应用典型案例实践及GPT模型应用 基…

【Ubuntu】apt 更换阿里源

Ubuntu apt 更换阿里源 1.Ubuntu apt 更换阿里源1.1 找到阿里官方相关镜像1.2 找到apt的源管理文件1.3 使用命令替换其源地址1.4 刷新源信息1.5 Failed to fetch http://xxxxxxx Temporary failure resolving ‘mirrors.aliyun.com‘ 1.Ubuntu apt 更换阿里源 1.1 找到阿里官方…

Java 设计模式 随笔1 监听器/观察者

0. 不由自主&#xff0c;恍恍惚惚&#xff0c;又走回头路&#xff0c;再看一眼有过的幸福… 太棒了流沙!!! 0.1 引用 https://blog.csdn.net/majunzhu/article/details/100869562 ApplicationEvent事件机制源码分析 单机环境下优雅地使用事件驱动进行代码解耦 1. JDK 1.1 …

LAXCUS分布式操作系统总体概述

本文回答用户问的一些情况&#xff0c;因为问题主要集中LAXCUS分布式操作系统的产品、市场、发展层面&#xff0c;技术问题倒是不多&#xff0c;我在这里做个总体概述的回答吧。 LAXCUS分布式操作系统是基于分布式运行环境构建的【数存算管】超融合一体化平台&#xff0c;处理…

Excel 合并单元格筛选时只出现首行

一、问题描述 如果对合并单元格直接筛选&#xff0c;只能筛选出第一个单元格的值 二、原因分析&#xff1a; Excel筛选单元格时&#xff0c;遇到不连续区域&#xff08;即中间有空白单元格&#xff09;会识别不到后续内容&#xff1b; 合并单元格后&#xff0c; 除首行外&…

测试中那些悲桑的。。。

今天不讲“锅”&#xff0c;也不讲知识&#xff0c;只聊聊我们在测试中那些悲桑的故事。鉴于过于真实&#xff0c;请新人慎看。 - 1 - 实验室环境中测试顺利进行&#xff0c; 一到发版时刻&#xff0c; 哦豁&#xff0c;出现了一个惊天大bug&#xff01; 通宵走起~ - 2 - 辛…

【机器学习核心总结】什么是RNN(循环神经网络)

什么是RNN(循环神经网络) 循环神经网络(Recurrent Neural Network)&#xff0c;在识别图像时&#xff0c;输入的每张图片都是孤立的&#xff0c;认出这张图片是苹果&#xff0c;并不会对认出下一张图片是梨造成影响。 但对语言来说&#xff0c;顺序是十分重要的&#xff0c;“…

六、计算机视觉相关内容

文章目录 前言一、图像增广1.1 常用的图像增广1.1.1 翻转和裁剪1.1.2 变换颜色1.1.3 结合多种图像增广方法 二、微调2.1 微调的步骤2.2 具体案例 三、 目标检测和边界框3.1 边界框 四、锚框五、多尺度目标检测六、目标检测数据集七、单发多框检测(SSD)八、区域卷积神经网络(R-C…