基于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 = ...
随机推荐
- ORM------多表操作
上面介绍了单表操作 下面就好比我们的sql语句这只能满足于我们的一些简单的操作不能适应我们更多的需要 所以我们需要用到更多的需求来进行我们的关系的建立以及查找 其实ORM语句就对应着我们的sql语句 ...
- aspnetcore 认证相关类简要说明二
能过<aspnetcore 认证相关类简要说明一>我们已经了解如何将AuthenticationOptions注入到我们依赖注入系统.接下来,我们将了解一下IAuthenticationS ...
- 用POP动画编写带富文本的自定义动画效果
用POP动画编写带富文本的自定义动画效果 [源码] https://github.com/YouXianMing/UI-Component-Collection [效果] [特点] * 支持富文本 * ...
- Java并发基础(上)——Thread
并发编程可以使我们将程序划分为多个分离的,独立运行的任务.通过多线程机制,这些独立任务都将由执行线程来驱动.在使用线程时,CPU将轮流给每个任务分配占用时间,每个任务都觉得自己在占用CPU,但实际上C ...
- Python学习---django下的Session操作 180205
和Cookie一样,都是用来进行用户认证.不同的是,Cookie可以吧明文/密文的信息都会KV返回给客户段,但是session可以吧用户的Value[敏感信息]保存在服务器端,安全. Django中默 ...
- 通过Windows Server 2008 R2建立iSCSI存储
名词解释:iSCSI技术是一种由IBM公司研究开发的,是一个供硬件设备使用的可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行 SCSI协议,使其能够在诸如高速千兆以太网上 ...
- Asp.Net MVC Identity 2.2.1 使用技巧(八)
一.添加管理链接 在View/Shared/_layout.cshtml,在页面导航上(28行)添加如下代码: @*通过身份验证并确认用户属于Admin角色显示管理菜单*@ @if (Request. ...
- Java 基本语法(关键字、标识符、常量、注释)
1. Java 程序的构成 对象(object):对象是类的一个实例,有状态和行为. 类(class):类是一个模板,它描述一类对象的行为和状态. 方法(method):方法就是行为,一个类可以有很多 ...
- ubuntu 14.04 配置 java 环境
下载java包 (这里以java8为例) java包的下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloa ...
- Eureka 集群高可用配置.
SERVER:1 server: port: 1111 eureka: instance: hostname: ${spring.cloud.client.ip-address} instance-i ...