基于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 = ...
随机推荐
- 延期年金(deferred annuity)
含义:推迟m个时期后才开始付款的年金. 延期年金现值为 二.永续年金(Perpetuity) 永续年金:无限期支付下去的年金. 为期末付永续年金(perpetuity-immediate)的现值 表示 ...
- The good life is one inspired by love and guided by knowledge
The good life is one inspired by love and guided by knowledge 伯特兰·罗素Bertrand Russell18721970 I can a ...
- 关于数据库SQL优化
1.数据库访问优化 要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?而大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件 ...
- CSS加载性能优化
将首屏页面要用到的CSS文件,放在页面头部加载,其他模块的CSS可以使用异步加载:loadCSS 和 Preload. 关于preload,推进2篇文章给大家看下: 1.通过rel="pre ...
- vue笔记2
vue项目目录 <pre> ├── build // 构建服务和webpack配置 ├── config // 项目不同环境的配置 ├── dist // 项目build目录 ├── in ...
- Codeforces Round #439 (Div. 2)【A、B、C、E】
Codeforces Round #439 (Div. 2) codeforces 869 A. The Artful Expedient 看不透( #include<cstdio> in ...
- java.lang.NoClassDefFoundError: org/aspectj/weaver/tools/PointcutPrimitive
问题:使用Spring时,报错:java.lang.NoClassDefFoundError: org/aspectj/weaver/tools/PointcutPrimitive问题原因: 少了as ...
- 根据自增ID生成不重复序列号
网上看到一个例子,源地址:https://www.aliyun.com/jiaocheng/536419.html 借鉴修改一下 实现根据long类型的用户ID生成6位随机邀请码,并且根据邀请码能算出 ...
- element-ui : <el-table> 按钮点击操作阻止@row-click
描述:<el-table> 点击行时,会跳转到一个详细信息页面, 但是同时这一行也有编辑和删除按钮. 问题: 在点击按钮时,@row-click事件也被触发了,而我并不想触发 row-cl ...
- map详讲<二>
查找元素: Map可以根据健来查找元素,提供方法find(key),如果是这个健对应的元素存在,则返回的是这个健的迭代器iterator,否则返回的是std::end(): 使用find()函数有点笨 ...