QT实现Opencv图像处理

news2024/11/28 10:53:48

案例

基于QT的人脸识别

pro文件需要加以下代码

INCLUDEPATH += E:/opencv/opencv3.4-qt-intall/install/include
INCLUDEPATH += E:/opencv/opencv3.4-qt-intall/install/include/opencv
INCLUDEPATH += E:/opencv/opencv3.4-qt-intall/install/include/opencv2
LIBS += E:/opencv/opencv3.4-qt-intall/install/x86/mingw/lib/libopencv_*.a

widget.h代码

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
#include<opencv2/face.hpp>
#include <vector>
#include <map>
#include <QMessageBox>
#include <QDebug>
#include <QFile>
#include <QTextStream>
#include <QDateTime>
#include <QTimerEvent>
#include<QtSerialPort/QtSerialPort>
#include<QtSerialPort/QSerialPortInfo>
using namespace  cv;
using namespace cv::face;
using namespace std;

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp代码

#include "widget.h"
#include "ui_widget.h"


Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //1、准备相关容器
    Mat src;           //用于存储图像
    Mat gray;           //用于存储灰度图
    Mat dest;          //用于存储均衡化图像
    VideoCapture video;    //视频流对象,用于存储视频数据
    CascadeClassifier c;    //定义级联分类器对象
    vector<Rect> faces;     //用于存储图像的人脸矩形区域

    //给级联分类器装载模型
    //函数原型:bool load( const String& filename );
    //参数:级联分类器模型,此处使用的是人脸分类模型
    //返回值:成功下载返回值真,否则返回假
    if(!c.load("E:\\opencv\\resourse\\haarcascade_frontalface_alt2.xml"))
    {
        QMessageBox::information(this, "提示", "人脸分类模型下载失败");
        return;
    }

    //2、加载视频到对象中来
    //函数原型:bool open(String  fileNmae);
    //功能:打开本地磁盘上的某个文件
    //参数:文件路径
    //返回值:成功打开返回真,否则返回假
    //if(!video.open(0))
    //打开给定路径的视频
    if(!video.open("E:\\opencv\\resourse\\01.mp4"))
    {
        QMessageBox::information(this, "提示","视频打开失败");
        return;
    }

    //程序执行至此,表示类 对象中包含了视频
    while(video.read(src))
    {
        //此时src中读取了一张图像
        //将图像进行翻转
        //函数原型:void flip(InputArray src, OutputArray dst, int flipCode);
        //参数1:要翻转的图像
        //参数2:翻转后的图像容器
        //参数3:翻转码:0表示按x轴翻转,正值表示按y轴翻转,负值表示两个轴都翻转
        flip(src, src, 1);

        /*src.at<cv::Vec3b>(i,j):表示该图像中的任意一个像素点,都是3字节组成
        for(int i=0; i<src.rows; i++)          //外层循环遍历行
        {
            for(int j=0; j<src.cols; j++)        //内层循环遍历列数
            {
                //遍历当前像素的每一个颜色值
                for(int k=0; k<3; k++)
                {
                    src.at<cv::Vec3b>(i,j)[k] = 255 - src.at<cv::Vec3b>(i,j)[k];   //获取该颜色的反差值
                }
            }
        }*/

        //灰度处理
        //函数原型:void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
        //参数1:要处理的原图像
        //参数2:色彩空间转换后的图像容器
        //参数3:转换规则:CV_BGR2GRAY表示将BGR图转变成灰度图
        cv::cvtColor(src, gray, CV_BGR2GRAY);

        //均衡化处理
        //函数原型:void equalizeHist( InputArray src, OutputArray dst );
        //参数1:要被处理的图像
        //参数2:均衡化处理后的图像容器
        cv::equalizeHist(gray, dest);

        //从灰度图中通过级联分类器获取人脸矩形区域
        c.detectMultiScale(dest, faces);
        //参数1:要被识别的图像
        //参数2:存储图像上的人脸矩形区域的容器

        //遍历矩形框数组,将所有的矩形框都绘制到指定图像上
        for(uint i=0; i<faces.size(); i++)
        {
            //该循环中找到任意一个矩形框 faces[i]
            cv::rectangle(src, faces[i], Scalar(0,0,255), 2);
            cv::rectangle(gray, faces[i], Scalar(0,0,255), 2);
            cv::rectangle(dest, faces[i], Scalar(0,0,255), 2);
            //参数1:要绘制矩形框的图像
            //参数2:要被绘制的矩形框
            //参数3:矩形框颜色
            //参数4:矩形框的粗细
        }

        //展示图像
        imshow("src", src);
        imshow("gray", gray);
        imshow("dest", dest);

        //调用延时函数
        if(waitKey(30) == 27)
        {
            //如果用户按下了ESC,可以结束循环
            break;
        }
    }
}

Widget::~Widget()
{
    delete ui;
}

运行效果

知识梳理

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

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

相关文章

Linux go语言配置

首先安装go语言 先从go官方下载源码 解压&#xff1a; tar -xzvf go1.23.1.linux-amd64.tar.gz 移动go到 /usr/local/ mv go /usr/local 设置环境变量 vi ~/.bashrc source ~/.bashrc 重新获取文件 输入 go version 查看版本

STM32 A/D转换器

目录 模拟量输入通道 A/D转换器简介 模拟量输入信号类型与量程自动转换 量程自动转换 STM32F103ZET6集成的ADC模块 STM32的ADC的主要特征 STM32的ADC模块结构 ADC中断事件主要有以下3个&#xff1a; 模拟量输入通道 模拟量输入通道一般由信号处理、模拟开关、放大器、采…

MES管理系统解决方案常见的应用场景

在现代制造业的浪潮中&#xff0c;车间管理的效率与智能化水平成为了企业竞争力的关键因素。许多车间管理者都耳闻MES管理系统解决方案能够显著优化生产执行流程&#xff0c;但由于缺乏亲身体验&#xff0c;往往对此持保留态度。那么&#xff0c;MES管理系统究竟能否如传闻般发…

po框架的了解和应用

https://www.cnblogs.com/xiaolehong/p/18458470 笔记 任务:1、通过po框架输入测试报告 2、编写自动化测试框架 3、总结测试讲解稿 自动化测试框架概念: 自动化测试框架是一个集成体系,这个体系中包含测试功能的函数、测试数据源、测试对以及重要的模块。 作用:用于解决或…

MIDIPLUS 50周年丨中国国际乐器展览会首日盛况

10月10日&#xff0c;由中国乐器协会、上海国展展览中心有限公司、法兰克福展览&#xff08;上海&#xff09;有限公司共同主办的中国&#xff08;上海&#xff09;国际乐器展览会在上海新国际博览中心&#xff08;上海市浦东新区龙阳路2345号&#xff09;盛大开幕。 2024上海…

ART 光学跟踪系统:通过 VR HMD 解锁完全沉浸式 VR 体验

在虚拟现实体验中&#xff0c;完全沉浸式虚拟现实体验应该既准确又舒适。当与现实世界的物体融合时&#xff0c;虚拟现实的表现必须与现实精确匹配。这意味着所使用的运动跟踪系统必须为整套项目提供可靠且可重复的高精度运动数据&#xff0c;以及体感无法察觉到的超低延迟。AR…

水深探测仪的作用和使用方法

在水域救援的行动里&#xff0c;救援人员时刻面临着复杂多变、充满未知的水域状况。当接到救援任务奔赴现场&#xff0c;那片需要涉足的水域就像一个神秘莫测的异世界&#xff0c;挑战着所有人的认知与勇气。 水深探测仪作为一种专用于测量水域深度的设备&#xff0c;通过声波和…

宝塔 进程守护管理器 神坑,再次跌入。thinkphp-queue队列 勤勤学长

如果&#xff0c;你有在使用【进程守护管理器】&#xff0c;记得在更新/重启&#xff0c;甚至卸载重新安装后&#xff0c;重启服务器。 事情的起因是&#xff0c;昨日服务器突然异常&#xff0c;网站无法正常访问&#xff0c;进入宝塔面板&#xff0c;发现 cpu和负载率均超过1…

甘肃小米,一口软糯,满是乡愁

&#x1f388;甘肃小米&#xff0c;自然的馈赠&#x1f388;&#x1f33e;家人们&#xff0c;今天必须给大家安利来自甘肃的小米&#xff01;&#x1f49b;✨甘肃&#xff0c;那片广袤而神奇的土地&#xff0c;孕育出的小米有着别样的魅力。颗粒饱满&#xff0c;色泽金黄&#…

RDD优化:缓存和checkpoint机制、数据共享(广播变量、累加器)、RDD的依赖关系、shuffle过程、并行度说明

文章目录 1. 缓存和checkpoint机制1.1 缓存使用1.2 checkpoint1.3 缓存和checkpoint的区别 2. 数据共享2.1 广播变量2.2 累加器 3. RDD依赖关系4.shuffle过程4.1 shuffle介绍4.2 spark计算要尽量避免shuffle 5. 并行度 1. 缓存和checkpoint机制 缓存和checkpoint也叫作rdd的持…

源代码加密有哪些技巧呢?除了用加密软件还有哪些方法?

导语&#xff1a;源代码加密是保护软件核心资产的主要方式了&#xff0c;可以通过多种技术措施确保源代码不被未授权访问、复制或篡改&#xff0c;防止泄密问题。这篇文章是一些有效的源代码加密技巧&#xff0c;欢迎您的阅读&#xff01; 源代码加密常用技巧1、访问控制&…

俏生元将传统膳食智慧融入现代生活,自然成分绽放健康光彩

近年来&#xff0c;当代女性健康食品市场正经历快速发展和显著变化。随着女性健康意识的提升&#xff0c;市场对专门针对女性健康的产品需求快速上升。女性消费者对健康的关注不再局限于表面&#xff0c;而是越来越注重内在健康和生活质量的提升。此外&#xff0c;中式养生文化…

Python 基于 Bert 的中文情歌分析,多分类中文情感分析

前言 在自然语言处理&#xff08;NLP&#xff09;领域中&#xff0c;情感分析是一项非常常见的任务。它的目标是判断文本的情感倾向&#xff0c;例如在社交媒体上的评论、产品评价、电影评论等数据中&#xff0c;识别文本是正面的、负面的&#xff0c;还是中性的。与传统的二分…

中航资本:科技股有哪几种?科技股都包含哪些板块?

科技股主要有两种&#xff0c;一种是软科技&#xff0c;一种是硬科技。 1、硬科技&#xff1a;需要强健的数学、物理、计算机科学和工程技能才能够完毕&#xff0c;例如&#xff1a;光电芯片、‌人工智能、‌航空航天、‌生物技能、‌信息技能、计算机视觉、集成电路规划、软件…

2024双十一值得入手的好物品牌有哪些?精选五款双十一必入好物推荐

在双十一这个全民狂欢的购物节&#xff0c;各大品牌纷纷推出诱人的优惠活动&#xff0c;让人心动不已。今年&#xff0c;有哪些品牌的好物值得我们关注呢&#xff1f;下面&#xff0c;我将为大家精选五款双十一必入好物推荐&#xff0c;让你的购物车不再空虚。 双十一必入好物…

怎么把人声和背景音乐分离?实用方法:将人声从音乐中剥离

怎么把人声和背景音乐分离?在数字音频处理中&#xff0c;将人声与背景音乐进行分离是一个复杂但富有挑战性的任务。这种分离技术在音乐制作、影视编辑、版权管理以及个人娱乐等多个领域具有广泛的应用价值。 虽然完美地将人声和背景音乐分离开来可能仍然是一个技术难题&#…

⽂件操作详解

本章讲述的是有关文件的相关内容&#xff0c;本章我们会认识到什么是文件&#xff0c;二进制文件与文本文件&#xff0c;文件的打开和关闭&#xff0c;⽂件的顺序读写和随机读写以及⽂件读取结束的判定和⽂件缓冲区。 1.什么是⽂件 像这样在磁盘&#xff08;硬盘&#xff09;上…

骑行眼镜的选择攻略:评论与实用建议!

骑行眼镜评论分析 目录 骑行眼镜评论分析 1. 评论的基本统计分析(数据来源&#xff1a;淘宝评论信息接口) 评论长度的集中趋势&#xff1a; 评论长度的离散程度&#xff1a; 2.用户评价分析 词云高频词分析 1. 眼镜 (2***8 次出现)&#xff1a; 2. 不错 (1***9 次出现)…

(29)数字信号处理中正弦波的表示

文章目录 前言一、奈奎斯特采样定理二、正弦波的时域表示三、数字信号处理中正弦波的表示方法 前言 本文首先介绍了奈奎斯特采样定理&#xff0c;然后以奈奎斯特采样定理为基础&#xff0c;给出MATLAB代码&#xff0c;说明在数字信号处理中如何表示一个正弦波。 一、奈奎斯特采…

Flutter技术学习

以下内容更适用于 不拘泥于教程学习&#xff0c;而是从简单项目入手的初学者。 在开始第一个项目之前&#xff0c;我们先要了解 两个概念。 Widget 和 属性 Widget 是用户界面的基本构建块&#xff0c;可以是任何 UI 元素。属性 是 widget 类中定义的变量&#xff0c;用于配…