摘要:利用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的人脸检测小系统的更多相关文章

  1. 基于OpenCV读取摄像头进行人脸检测和人脸识别

    前段时间使用OpenCV的库函数实现了人脸检测和人脸识别,笔者的实验环境为VS2010+OpenCV2.4.4,opencv的环境配置网上有很多,不再赘述.检测的代码网上很多,记不清楚从哪儿copy的 ...

  2. cvSmooth函数 和 OpenCV自带的人脸检测

    记录cvSmooth函数的用法和 OpenCV自带的人脸检测. (1)cvSmooth函数 void cvSmooth( const CvArr* src, CvArr* dst,int smooth ...

  3. 基于Android平台的简易人脸检测库

    代码地址如下:http://www.demodashi.com/demo/12135.html ViseFace 简易人脸检测库,不依赖三方库,可快速接入人脸检测功能. 项目依赖:compile 'c ...

  4. OpenCV 学习笔记 05 人脸检测和识别

    本节将介绍 Haar 级联分类器,通过对比分析相邻图像区域来判断给定图像或子图像与已知对象是否匹配. 本章将考虑如何将多个  Haar 级联分类器构成一个层次结构,即一个分类器能识别整体区域(如人脸) ...

  5. 【从零学习openCV】IOS7根据人脸检测

    前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app.总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...

  6. 基于opencv3.0下的人脸检测和检测部分的高斯模糊处理

    如题 这里将任务分解为三大部分: 1.录播放视频 2.人脸检测 3.部分高斯模糊 其中重点放在人脸检测和部分高斯模糊上 1.录播放视频(以opencv中的VideoCapture类进行实现) 首先罗列 ...

  7. Python使用OpenCV实现简单的人脸检测

    文章目录: OpenCV安装 安装numpy 安装opencv OpenCV使用 OpenCV测试 效果图: 注意: 图片人脸检测 程序要求: 技术实现思路 注意 本文使用的环境是:Windows+P ...

  8. OpenCV实践之路——人脸检测(C++/Python) 【转】

    转自:http://blog.csdn.net/xingchenbingbuyu/article/details/51105159 版权声明:本文为博主原创文章,转载请联系作者取得授权. 本文由@星沉 ...

  9. 调用opencv的接口实现人脸检测(简单)

    import cv2 import matplotlib.pyplot as plt %matplotlib inline # 提取预训练的人脸检测模型,提前下载好的模型 face_cascade = ...

随机推荐

  1. ORACLE 数据找回

    -- 找回一个小时前的数据 select * from sys_system_dictionary as of timestamp sysdate - 1/24order by id AS OF TI ...

  2. ubuntu13.04更新源

    最近163的源出问题了,又要换一次源. 报错如下: 查更新源的命令查了好多次,这次还是记下来吧,估计以后还会用到很多次. 常规来说,是要先备份的,不过感觉备份也没什么用,所以就直接跳过吧.. 1  打 ...

  3. Python学习---IO模型1227

    1.1. 事件驱动 事件驱动属于一种编程的范式,一种编程的风格,它擅长于处理一些未知的事件,通过绑定一个事件,外界触发后激活这个事情,达到执行某些操作的目的.比如浏览器的onclick()事件 1.2 ...

  4. redis-day1

    1 Redis 概述 REmote DIctionary Server(Redis)是一个基于key-value键值对的持久化数据库存储系统.redis和大名鼎鼎的Memcached缓存服务软件很像, ...

  5. c++我在努力----第三次作业体会

    [github地址](https://github.com/kobe96/object-oriented) 这次作业的三大难点 1.类的应用 从我们并没有接触过c++,到掌握如何写一个程序,多个类的引 ...

  6. MySQL ENCODE和DECODE加密列

    用法: ENCODE(str,passwd) DECODE(str,passwd) INSERT INTO test_log_1 VALUES (30,ENCODE("30",&q ...

  7. Eclipse 连接真实机器调试

    一.手机开启调试模式 二.安装adb.exe 1.确信 \android-sdk-windows\tools\下有 adb.exe     AdbWinApi.dll     AdbWinUsbApi ...

  8. iOS-建设银行破解分享

    https://i.cnblogs.com/Files.aspx 建设银行破解分享 问题描述一• 在越狱手机上控制银行客户端自动获取流水,并发送到服务器. 问题描述二• 怎么控制 • 通过在越狱手机上 ...

  9. linux 根据端口号查看占用进程的pid

    1.netstat -nap | grep 端口号 2.第一种的可以查看端口号对应的pid,但是会出现pid为空的情况,这种时候用:lsof -i:端口号 3.根据pid查看端口号 netstat - ...

  10. 多GPU计算

    多GPU计算已经可以说,只要是个成熟的模型,都使用了这一点. 例如: gluoncv:https://github.com/dmlc/gluon-cv/blob/master/scripts/dete ...