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

基于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天,给个赞都是对我很大的鼓励,加油,冲冲冲。

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值