基于opencv和qt的人脸检测小系统
摘要:利用opencv读取视频、图片并检测人脸,利用QT显示窗口,功能选择等
环境:Ubuntu18.04、OpenCV3.4.0、QT5.10.1
效果图:
代码如下(比较简单没什么注释):
main.cpp
- #include "widget.h"
- #include <QApplication>
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- Widget w;
- w.setWindowTitle("FaceDetect By lyj");
- w.show();
- return a.exec();
- }
widget.cpp(xml文件路径要根据个人情况修改)
- #include "widget.h"
- #include "ui_widget.h"
- #include <QDebug>
- #include <QPaintEvent>
- #include <QTimer>
- #include <QPainter>
- #include <QPixmap>
- #include <QLabel>
- #include <QImage>
- #include <QFileDialog>
- #include <QString>
- using namespace std;
- QString mydialog(QString title)
- {
- QString path;
- QFileDialog *fileDialog = new QFileDialog();//创建一个QFileDialog对象,构造函数中的参数可以有所添加。
- fileDialog->setWindowTitle(title);//设置文件保存对话框的标题
- fileDialog->setFileMode(QFileDialog::AnyFile);//设置文件对话框弹出的时候显示任何文件,不论是文件夹还是文件
- fileDialog->setViewMode(QFileDialog::Detail);//文件以详细的形式显示,显示文件名,大小,创建日期等信息;
- fileDialog->setGeometry(,,,);//设置文件对话框的显示位置
- fileDialog->setDirectory(".");//设置文件对话框打开时初始打开的位置
- if(fileDialog->exec() == QDialog::Accepted)
- {
- //注意使用的是QFileDialog::Accepted或者QDialog::Accepted,不是QFileDialog::Accept
- path = fileDialog->selectedFiles()[];//得到用户选择的文件名
- }
- delete fileDialog;
- return path;
- }
- Widget::Widget(QWidget *parent) :
- QWidget(parent),
- ui(new Ui::Widget)
- {
- ui->setupUi(this);
- state = ;
- connect(&theTimer, &QTimer::timeout, this, &Widget::updateImage);//连接信号与槽,图像刷新
- if(!face_cascade.load("/home/luoyijie/myprogram/qt_project/face_detection/haarcascade_frontalface_alt.xml"))
- {
- qDebug() << "load xml file failed";
- }
- num = ;
- ui->label->setText("FaceNum: " + QString::number(num));
- srcImage = Mat::zeros(, , CV_8UC3);//图像显示部分初始设置黑色
- this->update();
- }
- Widget::~Widget()
- {
- delete ui;
- }
- void Widget::on_button1_clicked()
- {
- if(state == )
- {
- state = ;
- if(videoCap.open())//摄像头读取视频流
- {
- srcImage = Mat::zeros(videoCap.get(CV_CAP_PROP_FRAME_HEIGHT), videoCap.get(CV_CAP_PROP_FRAME_WIDTH), CV_8UC3);
- theTimer.start();//time信号
- }
- }
- }
- void Widget::on_button2_clicked()
- {
- if(state == )
- {
- state = ;
- string path_ = mydialog("Open Video").toStdString();
- if(videoCap.open(path_))
- {
- srcImage = Mat::zeros(videoCap.get(CV_CAP_PROP_FRAME_HEIGHT), videoCap.get(CV_CAP_PROP_FRAME_WIDTH), CV_8UC3);
- theTimer.start();
- }
- }
- }
- void Widget::on_button3_clicked()
- {
- if(state == )
- {
- state = ;
- string path_ = mydialog("Open Picture").toStdString();
- srcImage = imread(path_);
- updateImage();
- }
- }
- void Widget::on_button4_clicked()
- {
- num = ;
- switch(state)
- {
- case : break;
- case :
- srcImage = Mat::zeros(, , CV_8UC3);
- theTimer.stop();
- this->update();
- videoCap.release();
- break;
- case :
- srcImage = Mat::zeros(, , CV_8UC3);
- theTimer.stop();
- this->update();
- videoCap.release();
- break;
- case :
- srcImage = Mat::zeros(, , CV_8UC3);
- this->update();
- break;
- }
- state = ;
- }
- void Widget::updateImage()
- {
- if(state == || state == )
- {
- videoCap >> srcImage;
- }
- if(srcImage.data)
- {
- vector<Rect> faces;
- face_cascade.detectMultiScale(srcImage, faces, 1.1, , , Size(,), Size(,));
- num = faces.size();
- if(faces.size() >= )
- {
- for(size_t i=;i<faces.size();i++)
- {
- Point p1(faces[i].x, faces[i].y);
- Point p2(faces[i].x + faces[i].width, faces[i].y + faces[i].height);
- rectangle(srcImage, p2, p1, cvScalar(, , ), , , );
- }
- }
- cvtColor(srcImage, srcImage, CV_BGR2RGB);//Qt中支持的是RGB图像, OpenCV中支持的是BGR
- cv::resize(srcImage, srcImage, Size(,));
- this->update(); //发送刷新消息
- }
- }
- void Widget::paintEvent(QPaintEvent *e)
- {
- QPainter painter(this);
- ui->label->setText("FaceNum: " + QString::number(num));
- QImage image1 = QImage((uchar*)(srcImage.data), srcImage.cols, srcImage.rows, QImage::Format_RGB888);
- painter.drawImage(QPoint(,), image1);
- }
widget.h
- #ifndef WIDGET_H
- #define WIDGET_H
- #include <QWidget>
- #include <QTimer>
- #include <QLabel>
- #include <QPaintEvent>
- #include <QPainter>
- #include <QPixmap>
- #include <QImage>
- #include "cv.h"
- #include "highgui.h"
- #include "opencv.hpp"
- using namespace cv;
- namespace Ui {
- class Widget;
- }
- class Widget : public QWidget
- {
- Q_OBJECT
- public:
- explicit Widget(QWidget *parent = );
- ~Widget();
- private slots: //声明槽
- void on_button1_clicked();
- void on_button2_clicked();
- void updateImage();
- void on_button4_clicked();
- void on_button3_clicked();
- private:
- Ui::Widget *ui; //ui界面对象指针
- QTimer theTimer;
- //QTimer 计时用;
- QLabel *imageLabel;
- Mat srcImage;
- VideoCapture videoCap;
- CascadeClassifier face_cascade;
- int state;//状态 camera是1,video是2,picture是3,back返回0
- int num;//检测到的人脸数量
- protected:
- void paintEvent(QPaintEvent *e);
- };
- #endif // WIDGET_H
.pro工程配置文件和.ui文件在整个工程的链接里面
https://files.cnblogs.com/files/luoyijie/face_detection.tar.gz
基于opencv和qt的人脸检测小系统的更多相关文章
- 基于OpenCV读取摄像头进行人脸检测和人脸识别
前段时间使用OpenCV的库函数实现了人脸检测和人脸识别,笔者的实验环境为VS2010+OpenCV2.4.4,opencv的环境配置网上有很多,不再赘述.检测的代码网上很多,记不清楚从哪儿copy的 ...
- cvSmooth函数 和 OpenCV自带的人脸检测
记录cvSmooth函数的用法和 OpenCV自带的人脸检测. (1)cvSmooth函数 void cvSmooth( const CvArr* src, CvArr* dst,int smooth ...
- 基于Android平台的简易人脸检测库
代码地址如下:http://www.demodashi.com/demo/12135.html ViseFace 简易人脸检测库,不依赖三方库,可快速接入人脸检测功能. 项目依赖:compile 'c ...
- OpenCV 学习笔记 05 人脸检测和识别
本节将介绍 Haar 级联分类器,通过对比分析相邻图像区域来判断给定图像或子图像与已知对象是否匹配. 本章将考虑如何将多个 Haar 级联分类器构成一个层次结构,即一个分类器能识别整体区域(如人脸) ...
- 【从零学习openCV】IOS7根据人脸检测
前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app.总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...
- 基于opencv3.0下的人脸检测和检测部分的高斯模糊处理
如题 这里将任务分解为三大部分: 1.录播放视频 2.人脸检测 3.部分高斯模糊 其中重点放在人脸检测和部分高斯模糊上 1.录播放视频(以opencv中的VideoCapture类进行实现) 首先罗列 ...
- Python使用OpenCV实现简单的人脸检测
文章目录: OpenCV安装 安装numpy 安装opencv OpenCV使用 OpenCV测试 效果图: 注意: 图片人脸检测 程序要求: 技术实现思路 注意 本文使用的环境是:Windows+P ...
- OpenCV实践之路——人脸检测(C++/Python) 【转】
转自:http://blog.csdn.net/xingchenbingbuyu/article/details/51105159 版权声明:本文为博主原创文章,转载请联系作者取得授权. 本文由@星沉 ...
- 调用opencv的接口实现人脸检测(简单)
import cv2 import matplotlib.pyplot as plt %matplotlib inline # 提取预训练的人脸检测模型,提前下载好的模型 face_cascade = ...
随机推荐
- [翻译] MagicPie
MagicPie Powerful pie layer for creating your own pie view. PieLayer provide great animation with si ...
- Windows系统通用安全配置基线
一:共享账号检查 配置名称:账号分配检查,避免共享账号存在 配置要求: 1.系统需按照实际用户分配账号: 2.根据系统的使用需求,设定不同的账户和账户组,包括管理员用户,数据库用户,审计用户,来宾用户 ...
- Android 通过触摸动态地在屏幕上画矩形
需求概述: 在屏幕上用手指画出一个区域,返回所圈的区域坐标. 技术实现: 自定义View,设置画笔及对应参数,在onTouchEvent()回调函数里,对触摸事件进行判断.画出矩形图形. 代码: 自定 ...
- 数据库相关文章转载(2) MySQL自带的性能压力测试工具mysqlslap详解
PS:今天一同事问我有木有比较靠谱的mysql压力测试工具可用.其实mysql自带就有一个叫mysqlslap的压力测试工具,还是模拟的不错的.下面举例说说.mysqlslap是从5.1.4版开始的一 ...
- java一些使用
随机数.输入.byte数组和string转换 一些可能会使用到的方法.供及时查找 ########################random类使用 Random random = new Rando ...
- python中的BaseManager通信(二)文件二分
提供服务部分(运行时在接收端未打开前不能关闭) #mainsec.py from multiprocessing import Process, Queue from multiprocessing. ...
- C++作用域 (二)
http://www.cnblogs.com/wolf-lifeng/p/3156936.html 2.3全局作用域 2.3.1概述 全局作用域是最大的名字空间作用域,不同于用户自定义的名字空间作用域 ...
- 用Web技术开发客户端(一)
http://www.cnblogs.com/lefan/archive/2012/12/27/2836400.html 范怀宇(@duguguiyu)分享了<豌豆荚2.0重构时遇到的坑> ...
- CentOS学习:第一天
阿里的一台ECS还有一个月到期,就趁这一个月的时间,用它来学习一下梦寐已久的CentOS. 由于历史原因,一直使用Windows环境,还从没接触过任何一种Linux系统. 在服务器端部署MySQL/T ...
- fastjson反序列化JdbcRowSetImpl
Gadget com.sun.rowset.JdbcRowSetImpl setAutoCommit() -> connect() -> InitialContext.lookup() p ...