QT连接OpenCV库实现人脸识别

这篇具有很好参考价值的文章主要介绍了QT连接OpenCV库实现人脸识别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、关于图像处理的相关类和函数

图像容器:Mat类

读取图像:

Mat imread( const String& filename, int flags = IMREAD_COLOR );
功能:读取出图像
参数:图像路径
返回值:读取的图像

 命名展示图像的窗口:

void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
功能:命名一个图像窗口
参数1:窗口名称
参数2:窗体尺寸,默认为自适应大小
返回值:无

展示图像:

void imshow(const String& winname, const ogl::Texture2D& tex);
功能:展示图像
参数1:要展示图像的窗口名称
参数2:要展示的二维图像
返回值:无

示例:

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    //1、定义一个图像容器
    Mat src;

    //2、将图像加载进来
    //函数原型:Mat imread( const String& filename, int flags = IMREAD_COLOR );
    //参数:图像的路径
    //返回值:图像容器
    src = imread("D:/opencv/resource/age.jpg");

    //4、命名一个展示图像的窗口
    //namedWindow("Test");

    //5、展示图像
    //函数原型:void imshow(const String& winname, const ogl::Texture2D& tex);
    //参数1:要展示图像的窗口名称
    //参数2:要展示的图像
    //返回值:无
    imshow("Test", src);
    return a.exec();
}

二、视频流相关类和函数

视频流类:VideoCapture

打开视频:

virtual bool open(const String& filename);
参数:要打开视频的路径
返回值:成功返回true失败返回false

若想要打开摄像头只需在构造时,调用构造函数参数传递0即可

读取视频流中图像:

virtual bool read(OutputArray image);
功能:读取视频流中的图像
参数:图像容器
返回值:成功读取返回true,失败或者视频结束返回false

 图像翻转:

void flip(InputArray src, OutputArray dst, int flipCode);
将图像进行旋转
参数1:要处理的图像
参数2:处理后的图像容器
参数3:处理规则:0:表示沿x翻转,1表示沿y轴翻转,-1表示沿xy轴翻转

休眠阻塞函数:

int waitKey(int delay = 0);
功能:阻塞等待用户输入数据,如果delay=0,则一直等待
参数:毫秒数
返回值:在等待过程中用户按下键的值

示例:

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    //1、定义视频流对象
    VideoCapture v(0);             //表明使用摄像头构造一个视频流对象

    //2、读取摄像头中的图像
    Mat src;                   //用于存放读取出来的图像

    //函数原型:virtual bool read(OutputArray image);
    //功能:从视频流中读取一张图像放入参数中
    //参数:图像容器
    //返回值:成功返回真,失败或者读取视频结束返回假
    while(v.read(src))
    {
        //将图像进行翻转
        //函数原型:void flip(InputArray src, OutputArray dst, int flipCode);
        //参数1:要翻转的图像
        //参数2:翻转后的图像容器
        //参数3:翻转规则:正数表示按y轴翻转,0表示按x轴翻转,负数表示按xy轴翻转
        flip(src, src, 1);

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

        //加延时函数
        //函数原型:int waitKey(int delay = 0);
        //参数:等待时间
        //返回值:在等待期间用户按下的键盘的ascii值    ESC键对应的值为27
        if(waitKey(20)==27)
        {
            break;
        }
    }
    return a.exec();
}

三、图像处理

灰度处理:

void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
功能:转换图像色彩空间
参数1:要转换的图像
参数2:转变后图像容器
参数3:转换规则:BGR to gray
返回值:无

均衡化处理:

void equalizeHist( InputArray src, OutputArray dst ); 
参数1:输入的灰度图像,必须是8-bit的单通道图像  
参数2:输出的图像 
图像直方图:对整个图像在灰度范围内的像素值(0-255)统计出现的频率,据此生成直方图,直方图反应了图像的灰度分布情况。

示例:

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    //1、定义视频流对象
    VideoCapture v(0);             //表明使用摄像头构造一个视频流对象

    //2、读取摄像头中的图像
    Mat src;                   //用于存放读取出来的图像
    Mat gray;                   //用于存储灰度图的图像容器
    Mat dst;                     //用于存储均衡化处理后的图像容器

    //函数原型:virtual bool read(OutputArray image);
    //功能:从视频流中读取一张图像放入参数中
    //参数:图像容器
    //返回值:成功返回真,失败或者读取视频结束返回假
    while(v.read(src))
    {
        //将图像进行翻转
        //函数原型:void flip(InputArray src, OutputArray dst, int flipCode);
        //参数1:要翻转的图像
        //参数2:翻转后的图像容器
        //参数3:翻转规则:正数表示按y轴翻转,0表示按x轴翻转,负数表示按xy轴翻转
        flip(src, src, 1);

        //3、将图像灰度处理
        //函数原型:void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
        //参数1:要转换的图像
        //参数2:转换后的图像容器
        //参数3:转换规则  CV_BGR2GRAY表示将bgr彩色图转换为gray灰度图
        //返回值:无
        cvtColor(src, gray, CV_BGR2GRAY);

        //4、对图像进行均衡化处理
        //函数原型:void equalizeHist( InputArray src, OutputArray dst );
        //参数1:要进行均衡化处理的图像,必须是单通道灰度图
        //参数2:均衡化处理后的图像容器
        //返回值:无
        equalizeHist(gray, dst);

        //展示彩色图像
        imshow("Test1", src);

        //展示灰度图像
        imshow("Test2", gray);

        //展示均衡化处理后的图像
        imshow("Test3", dst);

        //加延时函数
        //函数原型:int waitKey(int delay = 0);
        //参数:等待时间
        //返回值:在等待期间用户按下的键盘的ascii值    ESC键对应的值为27
        if(waitKey(20)==27)
        {
            break;
        }
    }
    return a.exec();
}

四、级联分类器

opencv级联分类器工具类 : CascadeClassifier

加载级联分类器配置文件 :

bool load( const String& filename ) 
参数1:分类器数据文件的名字
返回值:成功true,失败false

找到人脸所在位置的矩形区域:

void detectMultiScale(
const Mat& image, 
CV_OUT vector& objects,
double scaleFactor = 1.1,
int minNeighbors = 3, 
int flags = 0, 
Size ize = Size(24,24))
参数1:待检测灰度图像(数据少处理起来简单) 
参数2:被检测物体的矩形框向量( 人脸Rect矩形区域,其中objects.size()是人脸个数 ) 
参数3:前后两次相继的扫描中搜索窗口的比例系数,默认为1.1 即每次搜索窗口扩大10% 
参数4:构成检测目标的相邻矩形的最小个数 如果组成检测目标的小矩形的个数和小于 minneighbors - 1 都会被除 
参数5:若设置为CV_HAAR_DO_CANNY_PRUNING 函数将会使用Canny边缘检测来排除边缘过多 或过少的区域,,一般采用默认值0 
参数6:用来限制得到的目标区域的范围,一般检测人脸使用Size(24, 24)

显示矩形区域:

void rectangle(
CV_IN_OUT Mat& img, 
Rect rec,
const Scalar& color, 
int thickness = 1,
int lineType = LINE_8, 
int shift = 0);

img:图像。 
rec:表征矩形的位置和长宽。 
color:线条颜色 (RGB) 。 
thickness:组成矩形的线条的粗细程度。 
line_type:线条的类型。 
shift:坐标点的小数点位数,0表示没有小数点。

示例:

 文章来源地址https://www.toymoban.com/news/detail-696493.html

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    //1、定义视频流对象
    VideoCapture v(0);             //表明使用摄像头构造一个视频流对象

    //2、读取摄像头中的图像
    Mat src;                   //用于存放读取出来的图像
    Mat gray;                   //用于存储灰度图的图像容器
    Mat dst;                     //用于存储均衡化处理后的图像容器

    //5、实例化一个级联分类器的对象,用于找到图像中的人脸矩形区域
    CascadeClassifier c;
    //给类对象装载人脸识别模型
    //函数原型:bool load( const String& filename );
    //功能:给级联分类器对象,下载一个识别模型
    //参数:人脸识别模型的文件路径
    //返回值:成功下载返回真,失败返回假
    if(!c.load("D:/opencv/resource/haarcascade_frontalface_alt2.xml"))
    {
        QMessageBox::information(NULL,"失败", "人脸识别模型装载失败");
        return -1;
    }

    //定义容器存放人脸分类后的矩形框
    vector<Rect> faces;

    //函数原型:virtual bool read(OutputArray image);
    //功能:从视频流中读取一张图像放入参数中
    //参数:图像容器
    //返回值:成功返回真,失败或者读取视频结束返回假
    while(v.read(src))
    {
        //将图像进行翻转
        //函数原型:void flip(InputArray src, OutputArray dst, int flipCode);
        //参数1:要翻转的图像
        //参数2:翻转后的图像容器
        //参数3:翻转规则:正数表示按y轴翻转,0表示按x轴翻转,负数表示按xy轴翻转
        flip(src, src, 1);


        //3、将图像灰度处理
        //函数原型:void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
        //参数1:要转换的图像
        //参数2:转换后的图像容器
        //参数3:转换规则  CV_BGR2GRAY表示将bgr彩色图转换为gray灰度图
        //返回值:无
        cvtColor(src, gray, CV_BGR2GRAY);


        //4、对图像进行均衡化处理
        //函数原型:void equalizeHist( InputArray src, OutputArray dst );
        //参数1:要进行均衡化处理的图像,必须是单通道灰度图
        //参数2:均衡化处理后的图像容器
        //返回值:无
        equalizeHist(gray, dst);


        //6、使用级联分类器对象,获取人脸矩形区域
        //函数原型:void detectMultiScale( InputArray image,CV_OUT std::vector<Rect>& objects)
        //参数1:要进行识别的图像
        //参数2:对该图像识别后,的矩形框存放的数组容器
        c.detectMultiScale(dst, faces);


        //7、将上述得到的矩形框,全部都绘制到图像上
        for(int i=0; i<faces.size(); i++)
        {
            //将任意一个矩形框,全部都绘制到图像上
            //函数原型:void rectangle(CV_IN_OUT Mat& img, Rect rec,const Scalar& color, int thickness = 1)
            //参数1:要被绘制的图像
            //参数2:要绘制的矩形框
            //参数3:矩形框的颜色
            //参数4:矩形框的粗细
            //返回值:无
            rectangle(src, faces[i], Scalar(0,0,255), 2);
        }


        //8、像素反差
        for(int i=0; i<src.rows; i++)        //外层循环控制行数
        {
            for(int j=0; j<src.cols; j++)        //内层循环控制列数
            {
                //找到任意一个像素:src.at<Vec3b>(i,j)
                //找到任意一个像素中的通道中的值src.at<Vec3b>(i,j)[k]
                for(int k=0; k<3; k++)
                {
                    src.at<Vec3b>(i,j)[k] = 255 - src.at<Vec3b>(i,j)[k];  //对像素进行反差
                }


            }
        }

        //展示彩色图像
        imshow("Test1", src);

        //展示灰度图像
        imshow("Test2", gray);

        //展示均衡化处理后的图像
        imshow("Test3", dst);


        //加延时函数
        //函数原型:int waitKey(int delay = 0);
        //参数:等待时间
        //返回值:在等待期间用户按下的键盘的ascii值    ESC键对应的值为27
        if(waitKey(20)==27)
        {
            break;
        }
    }

    return a.exec();
}

到了这里,关于QT连接OpenCV库实现人脸识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt-OpenCV学习笔记--人脸识别

    本人从事机械设计12年,业余时间自学编程。 2022年4月6日,开始学习C#, 2022年9月7日,开始学习c++和Qt, 2022年10月28日,开始学习OpenCV, 今天终于搞定了传说中的 人脸识别  ,在此,做个记录。 人脸检测,是基于Haar特征的cascade分类器, 人脸识别,是基于LDA理论的Fisherface算

    2024年02月09日
    浏览(29)
  • Linux毕业设计:基于OpenCV和QT库实现的人脸识别考勤/门禁系统(arm嵌入式ubuntu)

            本文介绍:Linux上以opencv和qt库实现的人脸识别系统,可应用于考勤、门禁等场景,具有人脸录入、删除、人脸检测、识别、用户管理等完整功能。可运行于ARM嵌入式linux、ubuntu即纯软件、ARM+PC组合等多种方式,应用场景多样且易于移植各个平台。 毕业设计题目汇

    2024年02月04日
    浏览(48)
  • OpenCV+ Qt Designer 开发人脸识别考勤系统

    本系统是一个基于OpenCV和 Qt Designer 的人脸识别考勤系统,主要功能是自动识别摄像头中的人脸,并把人脸对应的姓名和打卡时间存储到数据库中,方便管理人员进行考勤管理。本系统使用 face_recognition 库进行人脸识别,使用 PyQt5 开发界面,然后把界面与代码进行整合。 系统

    2024年02月06日
    浏览(34)
  • opencv系列(1)--使用opencv和Qt6做一个视频监控器人脸识别

    这个程序是自己的下班之后,看看那个坏东西想来偷看我的电脑。我就随手做的一个程序。 1.能都显示摄像头的内容。 2.如果有人进入摄像头。 3.利用opencv的模型识别人脸,识别到了就保存到自己的电脑里面。 4.并把他的照片显示到界面上一段时间,告诉他,偷窥有罪。 5.程

    2024年02月11日
    浏览(25)
  • 基于Springboot+百度AI人工智能人脸识别考勤系统设计与实现

    基于Springboot+百度AI人工智能人脸识别考勤系统设计与实现  博主介绍: 《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费

    2024年02月05日
    浏览(44)
  • 基于OpenCV提供的人脸识别算法LBPH实现人脸识别

    本文通过学习LBPH人脸识别算法,简要了解人脸识别技术的原理,实现人脸采集、训练人脸模型实现人脸识别。 OpenCV库自带的人脸级联分级器具有很好的人脸检测和人脸追踪效果,它是一个基于Haar特征的Adaboost级联分类器。特别注意,OpenCV库虽然自带人脸级联分级器,但是识

    2024年02月03日
    浏览(36)
  • Java使用opencv实现人脸识别、人脸比对

    1. opencv概述 OpenCV是一个开源的计算机视觉库,它提供了一系列丰富的图像处理和计算机视觉算法,包括图像读取、显示、滤波、特征检测、目标跟踪等功能。 opencv官网:https://opencv.org/ opencv官网文档:https://docs.opencv.org/4.7.0/index.html 参考教程1:https://www.w3cschool.cn/opencv/ 参考教

    2024年02月08日
    浏览(38)
  • opencv实现人脸识别(c++实现)

    本文章基于opencv + VS2015 实现人脸检测 可以直接打开摄像头对人脸进行识别,这些标识框也会跟随你的人脸移动。隐私问题,我这里对图片进行了识别。 opencv中文文档 官方文档说明 功能 :用于从视频文件、图像序列或摄像机捕获视频的类 3.1.1 open bool cv::VideoCapture::open(int i

    2024年02月07日
    浏览(38)
  • 使用opencv实现简单的人脸识别

    opencv-python是一个python绑定库,旨在解决计算机视觉问题。使用opencv模块,可以实现一些对图片和视频的操作。 安装opencv之前需要先安装numpy, matplotlib。然后使用pip安装opencv库即可。 使用import cv2进行导入即可,需要注意的是cv2读取图片的颜色通道是BGR(蓝绿红)。 使用cv2.

    2023年04月19日
    浏览(37)
  • 基于树莓派和opencv实现人脸识别

    源码我放在github上了 https://github.com/FjnuThomas/-opencv- 各位哥哥姐姐clone代码别忘了给个小心心哦😘 前言 一、人脸检测 二、图像采集 三、开始训练 四、人脸识别 总结 我们这学期选修了一门嵌入式Linux,期末选择了基于树莓派和opencv实现人脸识别作为期末作业。为了展示的方便

    2023年04月23日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包