该部分承接(一),将会实现视频图像的处理以及人脸的识别

目录

四、图像处理

1. cvtColor

2. equalizeHist

五、脸部识别

1. 导入训练文件

2. 绘制人脸框

3. 截取人脸并转换格式


四、图像处理

为了减轻处理器的负担,使得程序运行更加流畅,并提高检测的准确率,我们需要将采集的图片进行灰度处理和均衡化处理。这需要用到两个函数:cvtColor和equalizeHist。这两个函数在官方文档的图像处理部分(imgproc. Image Processing)

1. cvtColor

该函数的官方接口为:

C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 )

Parameters:
  • src – input image: 8-bit unsigned, 16-bit unsigned ( CV_16UC... ), or single-precision floating-point.
  • dst – output image of the same size and depth as src.
  • code – color space conversion code (see the description below).
  • dstCn – number of channels in the destination image; if the parameter is 0, the number of the channels is derived automatically from src and code .

所以我们需要再声明一个Mat类的对象来保存灰度图片,根据官方文档所说,将RGB图片转换成灰度图片可使用CV_RGB2GRAY,因此,代码为:

Mat grayImg;
cvtColor(img,grayImg,CV_BGR2GRAY); //灰度处理

2. equalizeHist

该函数的官方接口为:

C++: void equalizeHist(InputArray src, OutputArray dst)

同样,我们需要声明一个Mat类的对象来保存均衡化后的图片,代码为:

Mat equalizeImg;
equalizeHist(grayImg,equalizeImg); //均衡化处理

因此,该部分的完整代码为:

#include <iostream>
#include "opencv2/opencv.hpp"using namespace std;
using namespace cv;int main()
{VideoCapture cap(0); // open the default cameraif(!cap.isOpened())  // check if we succeeded{cout<<"Camera open failed!"<<endl;return -1;}cout<<"Camera open successfully!"<<endl;Mat img;Mat grayImg;Mat equalizeImg;for(;;){cap >> img; // get a new img from cameracvtColor(img, grayImg, CV_BGR2GRAY); //灰度处理equalizeHist(grayImg,equalizeImg); //均衡化处理imshow("video", equalizeImg); //在video窗口中展示图片 waitKey(40); //设置帧率(40ms读取一帧)}return 0;
}

值得注意的是,该部分使用了新的库文件,所以编译时需要加上-lopencv_imgproc,即

g++ main.cpp -o main -lopencv_highgui -lopencv_core -lopencv_imgproc

五、脸部识别

1. 导入训练文件

在官方文档的objdetect. Object Detection中,找到CascadeClassifier 。CascadeClassifier是opencv下objdetect模块中用来做目标检测的级联分类器的一个类,它可以帮助我们检测例如车牌、眼睛、人脸等物体。它的大概原理就是判别某个物体是否属于某个分类。以人脸为例,我们可以把眼睛、鼻子、眉毛、嘴巴等属性定义成一个分类器,如果检测到一个模型符合定义人脸的所有属性,那么就认为它是一个人脸。

我们需要实例化该分类器,并使用OpenCV训练好的文件,该文件在/usr/share/opencv/haarcascades/ 目录中,我们选择其中的面部识别的xml文件:haarcascade_frontalface_alt2.xml

相应代码为

CascadeClassifier classifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml");

2. 绘制人脸框

接下来要想实现将人脸检测到,需要借助detectMultiScale函数,该函数的官方接口为:

C++: void CascadeClassifier::detectMultiScale(const Mat& image, vector<Rect>& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())

根据函数说明,我们需要声明vector<Rect>, 其余参数均有默认值,在此不加以修改,则

Vector<Rect> faces;
classifier.detectMultiScale(equalizeImg, faces); //检测人脸并返回在facas中

接下来需要将得到的人脸框出来,显示在图像上。这需要使用rectangle函数,官方接口为

C++: void rectangle(Mat& img, Rect rec, const Scalar& color, int thickness=1, int lineType=8, int shift=0 )

根据函数说明,我们的代码为:

rectangle(equalizeImg, faces[0], Scalar(255,255,255));

因为1. 导入训练文件中使用了objdetect. Object Detection部分的函数,所以编译命令需要变为:

g++ main.cpp -o main -lopencv_highgui -lopencv_core -lopencv_imgproc -lopencv_objdetect

但是此时会出现一个问题,当运行程序后,一开始摄像头未检测到人脸时,程序会报错。这是因为,当未检测到人脸时,faces里为空,rectangle函数调用faces[0]时出现地址越界错误,因此需要加一个优化。

if(faces.size())
{rectangle(equalizeImg, faces[0], Scalar(255,255,255));
}
elsecout<<"No face detected!"<<endl;

3. 截取人脸并转换格式

在该部分,我们需要将识别到的人脸截取出来,方便上传比对。

我们需要声明一个Mat对象,专门用于存放人脸图像,接下来将绘制出的人脸信息存放进去。

此外,我们需要将图像进行编码,这里需要使用imencode函数,官方接口为:

C++: bool imencode(const string& ext, InputArray img, vector<uchar>& buf, const vector<int>& params=vector<int>())

我们需要指定编码的格式为jpg,新定义一个存放编码后图片的容器vector<uchar>,该部分的代码为:

Mat faceImg;
vector<uchar> jpgBuf;
if(faces.size())
{rectangle(equalizeImg, faces[0], Scalar(255,255,255));faceImg = equalizeImg(faces[0]);imencode(".jpg", faceImg, jpgBuf);
}
elsecout<<"No face detected!"<<endl;

所以,该部分目前为止的总代码为:

#include <iostream>
#include "opencv2/opencv.hpp"using namespace std;
using namespace cv;int main()
{VideoCapture cap(0); // open the default cameraif(!cap.isOpened())  // check if we succeeded{cout<<"Camera open failed!"<<endl;return -1;}cout<<"Camera open successfully!"<<endl;Mat img;Mat grayImg;Mat equalizeImg;vector<Rect> faces;Mat faceImg;vector<uchar> jpgBuf;CascadeClassifier classifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml");for(;;){cap >> img; // get a new img from cameracvtColor(img, grayImg, CV_BGR2GRAY); //灰度处理equalizeHist(grayImg,equalizeImg); //均衡化处理classifier.detectMultiScale(equalizeImg, faces); //检测人脸并返回在facas中if(faces.size()){rectangle(equalizeImg, faces[0], Scalar(255,255,255)); //绘制矩形框faceImg = equalizeImg(faces[0]);    imencode(".jpg", faceImg, jpgBuf);    //将图片编码为jpg格式后存到jpgBuf中}elsecout<<"No face detected!"<<endl;imshow("video", equalizeImg); //在video窗口中展示图片 waitKey(40); //设置帧率(40ms读取一帧)}return 0;
}

重新编译运行即可

基于OpenCV的人脸识别考勤系统(二)相关推荐

  1. 基于OpenCV的人脸识别考勤系统

    考勤系统设计 学生上课考勤系统最初的方式是采用的人工纸质点名,目前仍旧有一部分学校依旧采用此种方法点名,这种方法也一直是被认为最有效的签到点名方式.但由于课程繁多加上学生人数众多, 代替点名现象普遍存 ...

  2. 基于OpenCV的人脸识别考勤系统(一)

    本文旨在叙述我基于OpenCV和百度智能云的人脸识别考勤项目, 根据此系列, 应该可以复现出完整的项目. 该项目是在Ubuntu 16.04系统下使用OpenCV技术进行开发的,如果想要成功复现,最好 ...

  3. 基于OpenCV的人脸识别考勤系统(三)

    目录 六.百度智能云人脸库的创建 七.人脸识别SDK的导入 八.百度云平台的接入 六.百度智能云人脸库的创建 在百度智能云的人脸识别控制台中,申请领取免费资源,在进一步页面中我们选择领取全部免费接口即 ...

  4. 基于Python的人脸识别考勤系统

    基于Python的人脸识别考勤系统 Python源文件: 基于Python3.7编程环境开发 需要安装 tkinter pil face_recognition OpenCV2 库来实现人脸识别 需要 ...

  5. 基于OpenCV的人脸识别签到系统

    1. 摘要 随着人工智能技术的发展,人脸识别技术应用到了生活的很多方面,本文利用人脸识别技术实现了人脸识别签到功能.具体采用 Python 语言以及 dlib 库.face_recognition 库 ...

  6. 基于OpenCV的人脸识别系统的pyhon源代码

    本论文主要阐述了基于OpenCV的人脸识别原型系统.基于生物特征识别的身份认证方法有指纹.掌纹.眼睛虹膜.人脸等,其中,由于人脸的稳定性和可见性,人脸识别的研究与应用成为热点,本文针对出租公寓安全管理 ...

  7. 【毕业设计_课程设计】基于opencv、dilb的员工人脸识别考勤系统

    文章目录 0 项目说明 1 需求分析 2 总体设计 3 详细设计 4 效果展示 5 实验心得 6 项目源码 7 最后 0 项目说明 基于opencv.dilb的员工人脸识别考勤系统 提示:适合用于课程 ...

  8. Python 毕业设计 - 基于 opencv 的人脸识别上课考勤系统,附源码

    一.简介 这个人脸识别考勤签到系统是基于大佬的人脸识别陌生人报警系统二次开发的. 项目使用Python实现,基于OpenCV框架进行人脸识别和摄像头硬件调用,同时也用OpenCV工具包处理图片.交互界 ...

  9. python人脸识别考勤系统 dlib+OpenCV和Pyqt5、数据库sqlite 人脸识别系统 计算机 毕业设计 源码

    一.项目介绍 Python语言.dlib.OpenCV.Pyqt5界面设计.sqlite3数据库 本系统使用dlib作为人脸识别工具,dlib提供一个方法可将人脸图片数据映射到128维度的空间向量,如 ...

最新文章

  1. 论文被拒,项目被砍?斯坦福「最惨」在读博士教你如何直面失败
  2. 切图工具优化的几点总结
  3. Java小结(二)——打印矩形和九九乘法表
  4. android做一个坦克大战小游戏_一个 ECharts 做的猜数小游戏
  5. C++实现桶排序(附完整源码)
  6. 每天一道LeetCode-----买卖商品问题,计算最大利润,分别有一次交易,两次交易,多次交易的情况
  7. 16.IDA-列出函数中存在的全部call
  8. matlab除fread外,Matlab中fread函数的高级使用方法及其帮助文档中容易引起歧义的地方...
  9. gitlab在push代码的时候报错
  10. C++ QT安装教程2021
  11. ThinkPad P53,T490,T590 Win7显卡驱动
  12. 谷歌play商店_不断关闭时如何修复Google Play商店
  13. mac下 iterm+Zsh+Oh My Zsh+tmux 配置方案
  14. 2298: [HAOI2011]problem a
  15. pdf压缩大小,一个简单的pdf压缩方法
  16. 自媒体人:如何在竞争激烈的环境下生存?
  17. IE兼容rotate旋转效果
  18. 你不必使用弱引用以避免内存泄漏
  19. 问题-delphi XE2 Stack Overflow- save your work and restart CodeGear
  20. 5款热门可视化工具对比,老板直呼酷炫!

热门文章

  1. java递归函数的解析
  2. 我真的没读野鸡大学!是他们不好好起名字!
  3. c语言什么叫溢出,c语言中整数溢出的概念
  4. 《乔布斯传》读后感:我得到的20条经验和教训
  5. 关于JAVA实现二维码以及添加二维码LOGO
  6. 回乡年轻人因无法适应“拼关系” 逃回北上广C
  7. uniapp最好用的二维码生成
  8. AD22安装Ansys EDB Exporter 扩展 将PCB导入到ANSYS Electronics Desktop
  9. 【数值分析Ⅰ】第三章:线性方程组求根方法
  10. ISO13485认证流程