基于OpenCV的垃圾分类项目的C++代码详解——学习笔记(三)

2023-11-01

基于OpenCV C++垃圾分类项目的代码详解(工训总结)——对分类结果进行简单的界面显示

Begining

今天给大家介绍一个简单写界面的代码。
一、问题描述:
1、当我们在做工程的时候经常需要一个简单的图形化用户界面来显示工程内部的变量信息,这个时候我们就需要组态一个简单的界面,但市面上做界面最强的是Qt,Qt的强大不用说,很多你能想到的功能和想不到的功能他里面都有,但正是因为它的强大,做起界面来是很复杂的。
那么有没有一个简单的,不复杂的,功能不需要很强大的组态开发工具呢?
这里给大家介绍一个头文件——cvui.h
这个头文件的强大之处在于:当你需要组态一个简单的界面时,不需要下载任何的KDE,只需要将这个头文件包含在你的工程路径下,经过简单的初始化就可以做一个组态界面,该头文件里包含了很多的函数,可以画个rect ,显示个参数,做个按钮等都是能行的,我在参加比赛时文件要求做一个显示垃圾分类内部个数的界面,用的就是这个,还是很好用的,推荐推荐推荐,嘤嘤嘤~。

这个cvui.h的文件资源放这里 cvui.h

二、上代码

本次代码有点简单,看下面:

#include "uiEnd.h"
#define CVUI_IMPLEMENTATION
#include "cvui.h"
#define WINDOW_NAME "ui"


int Recyclable;
int Kitchen;
int Hazardous;
int Other;
//需要照片的尺寸为400*450
int main()
{

    string myclass;

    int count = 0;
    cv::Mat frame = cv::imread("1.1.png");
    // 初始化窗口
    cv::namedWindow(WINDOW_NAME);
    cvui::init(WINDOW_NAME);
#if 1
    //四个垃圾桶
    cout << "ui begain" << endl;
    cvui::rect(frame,10,270,87,180,0xff0000,0xff0000);  //ag form:(frame,thex,they,widge,high,BDcl,Fulcl)

    cvui::rect(frame,107,270,87,180,0x00ff00,0x00ff00);

    cvui::rect(frame,204,270,87,180,0x0000ff,0x0000ff);

    cvui::rect(frame,301,270,87,180,0x000000,0x000000);

    cvui::rect(frame,20,290,50,65,0xff0000,0x000000);
    cvui::rect(frame,117,290,50,65,0x00ff00,0x000000);
    cvui::rect(frame,214,290,50,65,0x0000ff,0xffffff);
    cvui::rect(frame,311,290,50,65,0xffffff,0xffffff);
    //text
    //cvui::text(frame, 20, 20, "Recyclable",0.8,0xff0000);

    //垃圾桶标签
    cvui::text(frame, 10, 230, "Recyclable",0.6,0xff0000);//ag form:(frame,thex,they,char*,wordSize,wordColor)
    cvui::text(frame, 10, 250, "waste",0.8,0xff0000);
    cvui::text(frame, 107, 230, "Kitchen",0.6,0x00ff00);
    cvui::text(frame, 107, 250, "waste",0.6,0x00ff00);
    cvui::text(frame, 204, 230, "Hazardous",0.6,0x0000ff);
    cvui::text(frame, 204, 250, "waste",0.6,0x0000ff);
    cvui::text(frame, 301, 230, "Other",0.6,0x000000);
    cvui::text(frame, 301, 250, "rubbish",0.6,0x000000);

    //Begain table
    cvui::text(frame, 50, 50,"classity result", 1,0x000000);
    cvui::rect(frame, 50, 100, 300, 70,0x000000,0x000000);

    //infomation table
    cvui::imshow(WINDOW_NAME, frame);
    waitKey(0);
    while(1)
    {
        cin >> myclass;
        if(myclass == "9")
        {
            return 0;
        }
        cvui::rect(frame, 50, 100, 300, 70,0x000000,0x000000);
        cvui::rect(frame,20,290,50,65,0xff0000,0x000000);
        cvui::rect(frame,117,290,50,65,0x00ff00,0x000000);
        cvui::rect(frame,214,290,50,65,0x0000ff,0xffffff);
        cvui::rect(frame,311,290,50,65,0xffffff,0xffffff);
        if(myclass == "1")
        {
            cvui::printf(frame,55,135,0.5, 0xffffff,"%d  recyclables  sum %d  is ok",++count,  ++Recyclable);
        }else if(myclass == "2")
        {
            cvui::printf(frame,55,135,0.5, 0xffffff,"%d  kintchen  sum %d  is ok",++count,  ++Kitchen);
        }else if(myclass == "3")
        {
            cvui::printf(frame,55,135,0.5, 0xffffff,"%d  harmful  sum %d  is ok",++count,  ++Hazardous);
        }else if(myclass == "4" || myclass == "")
        {
            cvui::printf(frame,55,135,0.5, 0xffffff,"%d  other  sum %d  is ok",++count,  ++Other);
        }else if( myclass == "0")//classify
        {
            cvui::text(frame, 55, 135,"    classify ......   ", 0.5,0xffffff);
        }else 
        {
            cvui::text(frame, 55, 135,"    ui init ......   ", 0.5,0xffffff);

        }



        //cvui::printf(frame, 60, 50, 0.4, 0x000000, "%d", count);//投放顺序
        //投放的数量
        cvui::printf(frame, 22, 295, 1.0, 0xff0000, "%d", Recyclable);
        cvui::printf(frame, 119, 295, 1.0, 0x00ff00, "%d", Kitchen);
        cvui::printf(frame, 216, 295, 1.0, 0x0000ff, "%d", Hazardous);
        cvui::printf(frame, 313, 295, 1.0, 0x000000, "%d", Other);

        //刷新
        cvui::update();
        // 显示
        cvui::imshow(WINDOW_NAME, frame);
        waitKey(5);
        cout << "ui end " << endl;
    }
    return 0;
#endif
}


做了稍微的一点修改(从工程里剥离出来了),直接能在虚拟机上跑起来。

细节问题:1、

#include "cvui.h"
#define WINDOW_NAME "ui"

这个地方必须宏定义下,并且在哪个文件里画界面就定义在那个界面里。

细节问题:2、

cv::Mat frame = cv::imread("1.1.png");
    // 初始化窗口
    cv::namedWindow(WINDOW_NAME);
    cvui::init(WINDOW_NAME);

这里需要读取一张图片当做背景图,然后创建窗口进行初始化。

细节问题:3、

cvui::imshow(WINDOW_NAME, frame);
        waitKey(5);

这里,必须两个同时出现(在这里吃了很大的亏),如果你要是写imshow(),没写waitKey();是刷新不出来的,他们必须成对出现,(就像马克思哲学里的时空和物质运动一样)。这点很重要、很重要、很重要

3、这里介绍上面用的几个函数(很多大量的函数在cvui.h文件中都有很详细的说明,不再多介绍):

1)

 cvui::rect(frame,10,270,87,180,0xff0000,0xff0000);  //ag form:(frame,thex,they,widge,high,BDcl,Fulcl)

功能:就是画一个矩形,我在这里用到了7个参数,我直接用大白话解释
第一个:就是你要在哪个背景上画这个矩形,就把那个背景对应的Mat名写在这儿。
第二个,第三个:画布的坐上就为坐标原点,这两个参数就是在画布的哪个位置开始画,就是XandY。
第四个和第五个参数:你要画的这个矩形的宽度和高度。‘
第六个:你要画的这个矩形的边框是什么颜色的,0xffffff对应RGB,这个地方看你们的审美了。
第七个:你要画的这个矩形要用什么颜色去填充,注意这里是填充,上面是边框的颜色。

2)

cvui::text(frame, 10, 230, "Recyclable",0.6,0xff0000);//ag form:(frame,thex,they,char*,wordSize,wordColor)

功能:就是在界面上写字,我在这里用到了6个参数。
第一个:就是你要在哪个背景上画这个矩形,就把那个背景对应的Mat名写在这儿。
第二个,第三个:画布的坐上就为坐标原点,这两个参数就是在画布的哪个位置开始写,就是XandY。
第四个:你要写的这个字是什么。
第五个:字号的大小。
第六个:你要写的这些字是什么颜色的,0xffffff对应RGB,这个地方又要看你们的审美了。

3)

 cvui::printf(frame,55,135,0.5, 0xffffff,"%d  recyclables  sum %d  is ok",++count,  ++Recyclable);

功能:和text()这个函数差不多,唯一的差别就是它可以显示你想让它显示的变量了,和C语言里的那个很相似,这个参数就不多做解释了。
好了,到此为止,代码部分就完了。

三、看结果

在这里插入图片描述
和上面的代码结合不难看出,这个界面做的是良好的,对内部变量的组态是成功的,响应的速度也是很快的,但我自己觉得有点丑,看来还需要再改改。

四、终了

上述就是今天分享的所有内容了,如果对你有帮助,帮忙点个赞,我是小白,需要鼓励,嘻嘻嘻~

后续还有最后一个硬件驱动的文章,不过驱动的话和硬件联系很大,没有什么通用性,如果时间合适的话会继续给大家分享的。

如果有错误,请各位大佬批评指正,如果有和我一样的小白,哪里看不懂可以直接留言给我,我看到就会回复的,感谢。

这个是我第三篇文章了,也是我距离22考研的第209天,给个赞都是对我很大的鼓励,加油,冲冲冲。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于OpenCV的垃圾分类项目的C++代码详解——学习笔记(三) 的相关文章

  • 简单的 C++ 线程

    我正在尝试在 C Win32 中创建一个线程来运行一个简单的方法 我是 C 线程的新手 但对 C 中的线程非常熟悉 这是我想做的一些伪代码 static void MyMethod int data RunStuff data void R
  • 静态成员函数与C语言绑定?

    以下 C 代码可使用 Visual C 和 g 进行编译 struct S static void foo extern C void S foo struct T static void foo extern C void T foo a
  • C 中的分段错误

    我需要用 0 填充二维数组 但编译后的程序会出现此错误 怎么了 int main int vert 1001 1001 int hor 1001 1001 int dudiag 1416 1416 int uddiag 1416 1416
  • 当“”可以分配给std::string时,为什么有“clear”方法?

    一个可以用string clear函数清空字符串 也可以使用空双引号 来执行此操作 有什么不同 当您分配一个空字符串时 编译器必须在数据部分存储一个空的 C 字符串 并创建代码以将指向它的指针传递给赋值运算符 然后 赋值运算符必须从数据部分
  • 无法在更新面板中找到上传的文件

    aspx
  • C++17 中带有 noexcept 的 std::function

    在 C 17 中noexcept 已添加到类型系统中 http www open std org jtc1 sc22 wg21 docs papers 2015 p0012r1 html void r1 void f noexcept f
  • 函数原型和数组参数

    我正在学习 C 语法 并且已经开始研究数组了 我想问你一个问题 但首先让我回顾一下 这样我就知道我已经弄清楚了 我知道您可以使用以下语法将变量定义为数组 name
  • 在 C 中声明和初始化数组

    C 有没有办法先声明然后初始化数组 到目前为止 我一直在初始化一个这样的数组 int myArray SIZE 1 2 3 4 但我需要做这样的事情 int myArray SIZE myArray 1 2 3 4 在 C99 中 您可以使
  • 设置外部应用程序焦点

    在 VB NET 中 您可以使用以下命令将焦点设置到外部应用程序 AppActivate Windows Name or AppActivate processID As Integer 现在 如果您这样做 则效果很好 Dim intNot
  • 按位非运算符

    为什么要按位运算 0 打印 1 在二进制中 不是0应该是1 为什么 你实际上很接近 在二进制中 不是0应该是1 是的 当我们谈论一位时 这是绝对正确的 然而 一个int其值为0的实际上是32位全零 将所有 32 个 0 反转为 32 个 1
  • “volatile void function( ... )” 做了什么?

    我见过从语法角度来看 C 函数中 volatile 关键字有多少种用法 https stackoverflow com questions 7643528 how many usage does volatile keyword have
  • 为什么测试在 TeamCity 中运行比直接在 NUnit 中运行需要更长的时间?

    我进行了一些 C 性能测试 基本上运行两种不同的方法 并检查一种方法的运行速度是否比另一种方法快得多 当我在 NUnit 本地运行它们时 其中一个测试的运行速度是另一个测试的十倍 因此我有一个 NUnit 测试 它使用Stopwatch检查
  • 使用成员函数作为 std::shared_ptr 的自定义删除器时出现问题

    我正在尝试弄清楚如何将 std shared ptr 与自定义删除器一起使用 具体来说 我将其与 SDL Surface 一起使用 如下所示 std shared ptr
  • 表单.位置不起作用

    我之前问过这个问题 以为我已经解决了 但它仍然不起作用 Form Show 稍微移动表单位置 https stackoverflow com questions 1214014 form show moves form position s
  • 带有 Unicode 字符的主机名在 Windows 8 中有效

    Uri CheckHostName 回报UriHostNameType Unknown到处都是 但在 Windows 8 上 它又回来了UriHostNameType Dns 为什么突然间带有 Unicode 西里尔字符的主机名在 Wind
  • DLL 中的 XP 风格组合框

    我需要使用 C 和 WIN32 API 无 MFC 在 DLL 中创建 XP 风格的组合框 我设法在 DLL 中创建控件 不是以 XP 风格 我设法在带有清单的 exe 中创建 XP 样式组合框 但它在 DLL 中不起作用 为了让您的 DL
  • C语言:如何获取使用strtok()一次后剩余的字符串

    我的字符串是 A B C D E 分隔符是 如何获取执行 strtok 一次后剩余的字符串 即 B C D E char a A B C D E char separator char b strtok a separator printf
  • MPI_Gatherv:根数组中收到的垃圾值

    我正在尝试实施MPI Gatherv函数于C 根据我的程序 包括 root 在内的每个进程都应该创建一个大小等于 进程的等级 1 这将在所有单元格中保持进程的等级 然后这个本地数组被收集到根的 rcv array 中 不知何故 我得到了垃圾
  • 即使对于新上下文,OnModelCreating 也仅调用一次

    我有多个相同但内容不同的 SQL Server 表 在编写代码优先 EF6 程序时 我尝试为每个程序重用相同的数据库上下文 并将表名称传递给上下文构造函数 然而 虽然每次都会调用构造函数 但尽管每次都是从 new 创建数据库上下文 但 On
  • “保留供任何使用”是什么意思?

    注意 这是一个c questions tagged c问题 虽然我补充说c questions tagged c 2b 2b如果某些 C 专家可以提供 C 使用与 C 不同的措辞的基本原理或历史原因 在 C 标准库规范中 我们有这个规范文本

随机推荐

  • Python3.11教程4:异常处理

    文章目录 九 异常处理 9 1 异常堆栈跟踪 9 2 异常处理的基本语法 9 3 异常类及异常处理机制 9 4 自定义异常类 9 5 raise触发异常 及其与except的区别 9 6 异常链 9 7 处理多个不相关的异常 9 8 用注释
  • Web目录文件扫描程序(python)

    使用方法 首先找个网站 我们可以看到URL中有php后缀名 说明该网站为php网站 输入参数 URL 文件类型 线程数 即可扫出目录文件 验证一下 访问成功 代码 环境 pycharm python3 9 文件结构 dics文件夹下为各个后
  • 重庆三峡学院计算机英语期末考试,英语语言学试题B卷及答案(重庆三峡学院)

    语言学 英语语言学试题B卷及答案 重庆三峡学院 I Define the following linguistic terms 2 10 20 1 government 2 exocentric construction 3 complem
  • gdb之info/show命令

    一 gdb命令 相对于常见和常用的backtrace break watch step之类的指令来说 这两个都是相对比较小众的功能 只管来说 小众的功能就是使用的人比较少的功能 而使用的比较少的原因也可能是多方面的 一个可能的原因就是大部分
  • 并发程序设计

    ComputeTask h void executeComputeTask ComputeTask c include ComputeTask h include
  • 书摘】程序员成长的10个阶段

    导读 本文节选自机械工业出版社 程序员成长路线图 一书 该书的作者N216 张磊和吉阳一起回忆和总结了自己几十年的程序员成长经历 对当前程序员关心的热点 重点 难点问题给出了自己的看法和建议 通过对程序员的成长阶段进行划分 使得各个阶段的程
  • 什么是Java的跨平台性?原理是什么?

    所谓跨平台性 是指java语言编写的程序 一次编译后 可以在多个系统平台上 运行 实现原理 Java程序是通过java虚拟机在系统平台上运行的 只要该系统可以安 装相应的java虚拟机 该系统就可以运行java程序 机器码再上CPU运行 什
  • 《工程伦理与学术道德》之《工程活动中的环境伦理》

    工程伦理与学术道德 之 工程活动中的环境伦理 工程活动中的环境伦理 4 1 工程活动中环境伦理观念的确立 4 1 1 工业化过程中保护环境的两种思路 4 1 2 工程环境伦理的基本思想 4 1 3 工程环境伦理的核心问题 4 2 工程活动中
  • 22. 面向对象 - 高阶

    Hi 大家好 我是茶桁 之前的课程里面 我们简单的接触了面向对象编程 也和大家讲解了其思想 优缺点 相信上节课程结束之后 大家对面向对象都有了一定的理解 那么我们这节课 就进入面向对象的一些高阶部分 让我们继续来学习一些魔术方法以及Pyth
  • redis mysql_redis和mysql的结合示例

    mysql和redis的区别 mysql是关系型数据库 主要用于存放持久化数据 将数据存储在硬盘中 读取速度较慢 redis是非关系型数据库 即将数据存储在缓存中 缓存的读取速度快 能够大大的提高运行效率 但是保存时间有限 django中使
  • 【python】if __name__==‘__mian__‘ 如何理解,原理及作用

    1 什么是 name 1 为什么使用 name 属性 Python解释器在导入模块时 会将模块中没有缩进的代码全部执行一遍 模块就是一个独立的Python文件 开发人员通常会在模块下方增加一些测试代码 为了避免这些测试代码在模块被导入后执行
  • 【Flutter 1-14】Flutter手把手教程Dart语言——Dart语言引用、import、package使用

    作者 弗拉德 来源 弗拉德 公众号 fulade me 库 import 关键字可以帮助你创建一个模块化和可共享的代码库 代码库不仅只是提供 API 而且还起到了封装的作用 以下划线 开头的成员仅在代码库中可见 使用库 使用import来指
  • 对数学期望、方差、协方差、协方差矩阵的理解

    参考 概率论与数理统计 浙大 关键词 数学期望 数学期望的性质 方差 标准差 方差的性质 协方差 相关系数 协方差矩阵 数学期望 变量分布的中心 数学期望也叫期望 或者均值 E X 完全由X的概率分布决定 若X服从某一分布 也成E X 是该
  • [总结]音视频基础知识·一

    目前状态 音视频领域知识零基础 已经掌握理论或技能 1 数学 高等数学 概率论与数理统计 线性代数 2 计算机 计算机操作系统原理 计算机网络 C C 语言 3 信号处理 数字信号处理 信号与系统 4 嵌入式 单片机原理与应用 Linux基
  • 35. Search Insert Position(二分查找加插入下标)

    题目 Given a sorted array and a target value return the index if the target is found If not return the index where it woul
  • IDEA查看类的继承关系图形技巧,你学会了吗?

    最近正好也没什么可忙的 就回过头来鼓捣过去的知识点 到Servlet部分时 以前学习的时候硬是把从上到下的继承关系和接口实现记得乱七八糟 这次利用了IDEA的diagram 结果一目了然 也是好用到炸裂 就此分享 1 查看图形形式的继承链
  • 【Java】企业微信群机器人发送消息(文字、图片、MarkDown、文件消息)

    Java调用企业微信群机器人发送消息 2022 4 22更新 新增可发送文件消息 发送文件消息需要先将文件上传到企业微信的临时素材 url为https qyapi weixin qq com cgi bin webhook upload m
  • 项目打包部署之部署jar包和war包

    一 概述 本文将介绍将Java项目部署到Linux服务器上的步骤 首先 你需要了解服务器的基本知识和安装Java环境的方法 然后 我们就jar包和war包两种应用部署到Linux服务器上来进行讲解 包括如何将应用程序上传到服务器 如何配置服
  • keil编译错误 "Please select first the target STM32F10x...

    keil编译STM32工程时 error directive Please select first the target STM32F10x device used in your application in stm32f10x h f
  • 基于OpenCV的垃圾分类项目的C++代码详解——学习笔记(三)

    基于OpenCV C 垃圾分类项目的代码详解 工训总结 对分类结果进行简单的界面显示 Begining 今天给大家介绍一个简单写界面的代码 一 问题描述 1 当我们在做工程的时候经常需要一个简单的图形化用户界面来显示工程内部的变量信息 这个