摘要:利用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. JavaScript的本地对象、内置对象、宿主对象

    首先解释下宿主环境:一般宿主环境由外壳程序创建与维护,只要能提供js引擎执行的环境都可称之为外壳程序.如:web浏览器,一些桌面应用系统等.即由web浏览器或是这些桌面应用系统早就的环境即宿主环境. ...

  2. JpaRepository 查询规范

    1.JpaRepository支持接口规范方法名查询.意思是如果在接口中定义的查询方法符合它的命名规则,就可以不用写实现,目前支持的关键字如下. Keyword Sample JPQL snippet ...

  3. 如何在Code First、Database First和Model First之间选择

    Code First.Database First和Model First基本图解: 1)Database First: 如果数据库已经存在,可以使用VS自动生成数据模型,已经相关的edmx信息 2) ...

  4. Foj 2299 Prefix(AC自动机、DP)

    Foj 2299 Prefix 题意 给定串s.正整数n,问有多少长度为n的字符串t满足:s[0...i]是t的子串,s[0...i+1]不是. 题解 求有多少长度为n的字符串t满足:s[0...i] ...

  5. keepalived安装文档

      安装依赖 su - root yum -y install kernel-devel* yum -y install openssl-* yum -y install popt-devel yum ...

  6. Socket Tools的使用

    1.启动工具 Socket Tools.exe , 分享:链接:http://pan.baidu.com/s/1dFiuEHz 密码:1sv9 2.在本地创建TCP Server,自动启动监听 3.在 ...

  7. 动画的分类:属性(几何)动画、内容(视频)动画:gpu vs cpu

    属性动画通过gpu根据属性来呈现: 内容动画通过cpu解码内容按照时间呈现给gpu: (或者gpu直接解码现实?)

  8. visual stdio 安装OpenGL库文件

    1.将下载的压缩包解开.将得到5个文件 1. 将glut解压出来,将当中的glut.h拷贝到C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC ...

  9. Guava包学习--Table

    Table,顾名思义,就好像HTML中的Table元素一样,其实就是行+列去确定的值,更准确的比喻其实就是一个二维矩阵. 其实它就是通过行+列两个key去找到一个value,然后它又containsv ...

  10. 友盟消息推送api、python sdk问题、测试demo代码

    一,友盟消息推送python服务端sdk地址和文档地址 1.sdk地址:http://dev.umeng.com/system/resources/W1siZiIsIjIwMTYvMDgvMTkvMT ...