openFrameworks_如何使用ofxXmlSettings和ofxGui来创建识别界面

news2024/12/26 11:09:04

效果图:

代码及详解

1.添加两个插件的头文件:

#include "ofxGui.h"
#include "ofxXmlSettings/src/ofxXmlSettings.h"

2.添加GUI部分,然后在.h声明右边的openframeworks的UI部分,包括面板ofxPanel,按钮ofxButton,滑块ofxSlider,切换ofxToggle,组ofxGuiGroup:

ofxPanel panel;
ofxToggle ip;
ofxIntSlider port;
ofxIntSlider device;
ofxToggle cutFilter;
ofxGuiGroup depthGroup;
ofxToggle useDepth;
ofxToggle base;
ofxIntSlider deviceX;
ofxIntSlider deviceY;
ofxIntSlider gridX;
ofxIntSlider gridY;
ofxButton save;

int portInt = 3333;
int deviceXInt = 1;
int deviceYInt = 1;
int gridXInt = 2;
int gridYInt = 2;

3. 在ofApp::setup()函数中对变量赋值:

panel.setPosition(250, 0);
panel.setup("Values", "toolsConfig", 250, 0);
panel.setName("Values");
panel.add(ip.setup("ip", false));
panel.add(port.setup("port", 3333, 3333, 3350));
panel.add(device.setup("device", 0, 0, 3));
panel.add(cutFilter.setup("cutFilter", false));
depthGroup.setup("depthGroup");
depthGroup.setName("depthGroup");
depthGroup.add(useDepth.setup("useDepth", false));
depthGroup.add(base.setup("base", false));
depthGroup.minimize();
panel.add(&depthGroup);

panel.add(deviceX.setup("deviceX", 1, 1, 6));
panel.add(deviceY.setup("deviceY", 1, 1, 6));
panel.add(gridX.setup("gridX", 2, 2, 10));
panel.add(gridY.setup("gridY", 2, 2, 10));
panel.add(save.setup("save"));
panel.minimizeAll();

panel.loadFromFile("toolsConfig.xml");

gui.setPosition(250, 0);//设置panel的位置

gui.setup("Values", "toolsConfig", 250, 0);//设置名称,位置和config

panel.setName("Values");//设置panel的名称

panel.add(ip.setup("ip", false));//将ip的名字设置在UI上,并记录点击切换后的数值

panel.add(port.setup("port", 3333, 3333, 3350));//同上

panel.add(device.setup("device", 0, 0, 3));//同上

panel.add(cutFilter.setup("cutFilter", false));//同上

depthGroup.setup("depthGroup");//设置组

depthGroup.setName("depthGroup");//设置组名称

depthGroup.add(useDepth.setup("useDepth", false));//组内添加useDepth,并设置false

depthGroup.add(base.setup("base", false));//同上

depthGroup.minimize();//将组最小化

panel.add(&depthGroup);//将组添加到panel中

panel.add(deviceX.setup("deviceX", 1, 1, 6));//设置水平方向设备数量

panel.add(deviceY.setup("deviceY", 1, 1, 6));//设置竖直方向设备数量

panel.add(gridX.setup("gridX", 2, 2, 10));//设置调试点水平方向数量

panel.add(gridY.setup("gridY", 2, 2, 10));//设置调试点竖直方向数量

panel.add(save.setup("save"));//设置保存按钮及名称

panel.minimizeAll();

panel.loadFromFile("toolsConfig.xml");//加载一个名为"toolsConfig.xml"的配置文件到panel对象

//设置背景颜色

ofSetBackgroundColor(ofColor::cornflowerBlue);

//对滑块添加监听事件

device.addListener(this, &ofApp::deviceChange);

4.ofApp::draw()函数中对调用绘制方法:

panel.draw();

5.添加xml外部配置,在.h中声明ofxXmlSettings的变量

ofxXmlSettings xml;

6.在ofApp::setup()函数中对xml调用:

xml.loadFile("config.xml");

7.按保存按键对UI上的数值进行保存:

if(save){
   xml.setValue("ip", ip == false ? "127.0.0.1" : "192.168.0.2");
   xml.setValue("port", port);
   xml.setValue("device", device);
   xml.setValue("cutFilter", cutFilter);
   xml.setValue("useDepth", useDepth);
   xml.setValue("base", base);
   xml.setValue("gridX", gridXInt - 1);
   xml.setValue("gridY", gridYInt - 1);
   xml.setValue("deviceX", deviceXInt);
   xml.setValue("deviceY", deviceYInt);
   xml.saveFile("config.xml");
   panel.saveToFile("toolsConfig.xml");
}

//设置xml中相应的参数并存入xml外部配置中,其他的同理

xml.setValue("ip", ip == false ? "127.0.0.1" : "192.168.0.2");

 7.添加相应的介绍,在.h中声明函数:

	void description();

8.在ofApp::draw()函数中对调用介绍方法:

void ofApp::draw() {
	panel.draw();
	description();
}

9.description()方法中的代码如下:

void ofApp::description() {
	selectFont(18, DEFAULT_CHARSET, "宋体");
	ofSetColor(ofColor::white);
	drawCNString(ip == false ? "ip地址:127.0.0.1" : "ip地址:192.168.0.2", 20, 35);
	drawCNString(("端口号:" + ofToString(portInt)).c_str(), 20, 55);
	drawCNString(("设备类别:" + ofToString(deviceName)).c_str(), 20, 75);
	drawCNString(cutFilter == false ? "滤光片状态:初始不切换" : "滤光片状态:初始切换", 20, 95);
	drawCNString(useDepth ? "图像类别:深度图像" : "图像类别:红外图像", 20, 115);

	if (deviceType == 0 || deviceType == 1) {
		drawCNString("测距基准:无", 20, 135);
	}
	else {
		if (useDepth) {
			drawCNString(base ? "测距基准:识别设别" : "测距基准:被测环境", 20, 135);
		}
		else {
			drawCNString("测距基准:无", 20, 135);
		}
	}

	drawCNString(("水平摄像头数量:" + ofToString(deviceXInt)).c_str(), 20, 155);
	drawCNString(("垂直摄像头数量:" + ofToString(deviceYInt)).c_str(), 20, 175);
	drawCNString(("水平校准点数量:" + ofToString(gridXInt)).c_str(), 20, 195);
	drawCNString(("垂直校准点数量:" + ofToString(gridYInt)).c_str(), 20, 215);

}

10.切换device所执行的方法代码如下:

void ofApp::deviceChange(int& device)
{
	switch (device)
	{
	case 0:
		deviceName = "普通摄像头";
		useDepth = false;
		width = 640;
		height = 480;
		depthGroup.minimize();
		break;
	case 1:
		deviceName = "可切换滤光片";
		useDepth = false;
		width = 640;
		height = 480;
		depthGroup.minimize();
		break;
	case 2:
		deviceName = "Kinect2";
		useDepth = true;
		width = 512;
		height = 424;
		depthGroup.minimize();
		depthGroup.maximize();
		break;
	case 3:
		deviceName = "奥比中光";
		useDepth = true;
		width = 640;
		height = 480;
		depthGroup.minimize();
		depthGroup.maximize();
		break;
	default:
		break;
	}
}

最终的效果已经发在文章的开篇了

给个关注,接下来这些天我将手把手教你使用openframeworks制作一个多媒体互动的识别软件。

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

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

相关文章

【JUC并发编程系列】深入理解Java并发机制:线程局部变量的奥秘与最佳实践(五、ThreadLocal原理、对象之间的引用)

文章目录 【JUC并发编程系列】深入理解Java并发机制:线程局部变量的奥秘与最佳实践(五、ThreadLocal原理、对象之间的引用)1. 基本 API 介绍2. 简单用法3. 应用场景4. Threadlocal与Synchronized区别5. 内存溢出和内存泄漏5.2 内存溢出 (Memory Overflow)5.2 内存泄…

如何融合文本信息提高时序预训练模型?

今天小编给大家介绍两篇联合文本和时序数据进行预训练的文章。 UniTime: A Language-Empowered Unified Model for Cross-Domain Time Series Forecasting 文献地址:https://arxiv.org/pdf/2310.09751.pdf 代码地址:https://github.com/liuxu77/UniTim…

【永磁同步电机(PMSM)】 4. 同步旋转坐标系仿真模型

【永磁同步电机(PMSM)】 4. 同步旋转坐标系仿真模型 1. Clarke 变换的模型与仿真1.1 Clarke 变换1.2 Clarke 变换的仿真模型 2. Park 变换的模型与仿真2.1 Park 变换2.2 Park 变换的仿真模型 3. Simscape标准库变换模块3.1 abc to Alpha-Beta-Zero 模块3…

【COMSOL】1-1 COMSOL6.2软件安装

1.解压COMSOL软件安装包,以管理员身份运行Setup.exe 2.选择简体中文,点击下一步,点击新安装。 3.选择许可证文件 4.自定义安装的位置 5.取消勾选更新,点击下一步 6.若已安装MATLAB则自动识别文件夹,若未安装空着即可&a…

Linux学习笔记(2)

Linux学习笔记(2) 知识点: 1.打包、压缩——是什么、为什么、怎么做? 什么是打包、压缩? 打包:把文件合并。 压缩:通过一定算法减少体积。 为什么要进行打包、压缩? 打包&…

花园管理系统

基于springbootvue实现的花园管理系统 (源码L文ppt)4-074 4功能结构 为了更好的去理清本系统整体思路,对该系统以结构图的形式表达出来,设计实现该“花开富贵”花园管理系统的功能结构图如下所示: 图4-1 系统总体结…

【LLM论文日更】| 俄罗斯套娃嵌入模型

论文:https://proceedings.neurips.cc/paper_files/paper/2022/file/c32319f4868da7613d78af9993100e42-Paper-Conference.pdf代码:GitHub - RAIVNLab/MRL: Code repository for the paper - "Matryoshka Representation Learning"机构&#x…

vue3ScrollSeamless滚动如何给子元素添加点击事件:事件委托

页面布局如上截图 下面是方法 function parentClick(e) {if (e.target.tagName A) {router.push({path: /noticeDetails,query: {id: e.target.dataset.eid}});} }使用的时候,可以打印一下方法里面的e,加深理解

Microsoft Edge 五个好用的插件

🐣个人主页 可惜已不在 🐤这篇在这个专栏 插件_可惜已不在的博客-CSDN博客 🐥有用的话就留下一个三连吧😼 目录 Microsoft Edge 一.安装游览器 ​编辑 二.找到插件商店 1.打开游览器后,点击右上角的设置&#…

【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(下)

系列文章目录 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上) 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(下) 文章目录 系列文章目录前言一、装饰器语法6.Builder语法:(1&…

室内北斗定位系统常用的几种定位方式

随着科技的不断进步,室内定位技术日益成熟,为人们的日常生活和工作带来了极大的便利。特别是在室内环境中,北斗卫星定位系统通过一系列创新技术,实现了高精度、高可靠的定位服务。接下来就由深圳沧穹科技给大家具体介绍室内北斗定…

OpenCL 学习(2)---- OpenCL Platform 和 Device

目录 OpenCL PlatformOpenCL Device参考代码 OpenCL Platform opencl 支持的 Platform 可以使用 clGetPlatformIDs 函数查询,函数原型如下: clGetPlatformIDs(cl_uint /* num_entries */,cl_platform_id * /* platforms */,cl_uint * …

解锁亚马逊测评自养号防关联新技术

解锁亚马逊测评自养号防关联的新技术主要包括以下几个方面,这些技术旨在提高测评过程的安全性,降低账号被关联的风险: 1. 独立纯净IP技术 独立纯净IP:采用独立、纯净且未受污染的国外IP地址,确保这些IP未被标记或列入…

CSS clip-path 属性的使用

今天记录一个css属性clip-path,首先介绍下这个属性。 clip-path 是CSS中的一个神奇属性,它能够让你像魔术师一样,对网页元素施展“裁剪魔法”——只展示元素的一部分,隐藏其余部分。想象一下,不用依赖图片编辑软件&am…

JavaWeb--纯小白笔记04:Tomcat整合IDEA

IDEA整合Tomcat 1.点击Idea的导航栏里的Run,选择Edit Configurations 2.点击左上角的"",向下翻找到Tomcat Server 选择里面的Local 3.创建一个web工程,点击IDEA的File-->new-->project 然后选择Java Enterprise,…

【网络安全】网络基础第一阶段——第一节:网络协议基础---- OSI与TCP/IP协议

从今天起,我们正式进入第二部分——网络基础。继续学习网络基础、网络协议等相关内容🌟🌟🌟 目录 一、OSI模型 1.1 分层思想 1.2 OSI参考模型 1.3 数据封装与解封装 1.3.1 数据的封装过程 1.3.2 数据的解封装过程 二、TCP/…

实现信创Linux桌面录制成MP4(源码,银河麒麟、统信UOS)

信创国产化已是大势所趋,在国产操作系统上的应用开发的需求越来越多,比如,有客户需要在银河麒麟和统信UOS上实现录制桌面生成一个mp4文件。那么这个要如何实现了? 一. 技术方案 要完成这些功能,具体来说,…

初写MySQL四张表:(4/4)

进度条很喜人,你是否已经修炼到这一步了呢? 初写MySQL四张表:(1/4)-CSDN博客 初写MySQL四张表:(2/4)_数据库表样例-CSDN博客 初写MySQL四张表:(3/4)-CSDN博客 若现在你已经有了前面的基础,那就正式开始吧。 四张表: 这次在实现…

JavaScript 基础 - 第20天_Node.js入门

文章目录 Day01_Node.js入门提前安装软件目录学习目标01.什么是 Node.js目标讲解小结 02.fs模块-读写文件目标讲解小结 03.path模块-路径处理目标讲解小结 04.案例-压缩前端html目标讲解小结 05.案例-压缩前端JS目标讲解小结 06.认识URL中的端口号目标讲解小结 07.http模块-创建…

花生壳、神卓互联等主流内网穿透技术分享

目录 贝锐花生壳 PHTunnel技术 神卓互联WanGooe Tunnel 技术 贝锐花生壳 PHTunnel技术 贝锐花生壳内网穿透服务商,(使用技术:底层采用自研 PHTunnel技术)除了具备无需公网IP,无需搭建专线、3步创建映射等优势,还拥有可靠、稳定的…