概述
完整人脸识别系统(源码+教程+环境):
开源毕业设计:基于嵌入式ARM-Linux的应用OpenCV和QT实现的人脸识别系统(源码+论文)
完全毕设教程:Linux上Opencv与Qt实现的人脸识别的考勤点名/门禁系统(PC与嵌入式ARM版本)
本文将实现opencv的人脸检测,首先从最简单的图片检测人脸开始。
在opencv中,主要有 Haar特征 和 LBP特征 进行人脸检测。
opencv自带训练好的分类器,在源码的data目录下有“lbpcascades”,“haarcascades”,“hogcascades”三个文件夹,分别表示通过“haar”、“hog”和“lbp”三种不同的特征而训练出的分类器。"haar"特征主要用于人脸检测,“hog”特征主要用于行人检测,“lbp”特征主要用于人脸识别。如,在“haarcascades”下是大量的针对不同目标的训练文件,如下:
从文件名也大概能看出各个文件主要用途。
人脸检测器(默认):haarcascade_frontalface_default.xml
人脸检测器(快速Harr):haarcascade_frontalface_alt2.xml
人脸检测器(侧视):haarcascade_profileface.xml
眼部检测器(左眼):haarcascade_lefteye_2splits.xml
眼部检测器(右眼):haarcascade_righteye_2splits.xml
嘴部检测器:haarcascade_mcs_mouth.xml
鼻子检测器:haarcascade_mcs_nose.xml
身体检测器:haarcascade_fullbody.xml
人脸检测器(快速LBP):lbpcascade_frontalface.xml
本文中,我们将利用“haarcascade_frontalface_alt2.xml”对上面图片进行人脸检测。
首先,应用“CascadeClassifier”实例化
CascadeClassifier faceCascade;
加载分类器:
bool CascadeClassifier::load( const String& filename )
人脸检测:
void CascadeClassifier::detectMultiScale( InputArray image,
CV_OUT std::vector<Rect>& objects,
double scaleFactor,
int minNeighbors, int flags,
Size minSize,
Size maxSize )
各参数如下:
- InputArray image: 需要被检测的图像(灰度图)
- vector<Rect>& objects: 保存被检测出的人脸位置坐标序列
- double scaleFactor: 每次图片缩放的比例
- int minNeighbors: 每一个人脸至少要检测到多少次才算是真的人脸
- int flags: 决定是缩放分类器来检测,还是缩放图像
- Size minSize: 表示人脸的最小尺寸
- Size maxSize: 表示人脸的最大尺寸
一、图片中的人脸检测
代码实现:
#include<opencv2/objdetect/objdetect.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
CascadeClassifier faceCascade;
int main()
{
faceCascade.load("/root/library/opencv/opencv-3.4.0/data/haarcascades/haarcascade_frontalface_alt2.xml"); //加载分类器
Mat img = imread("myImage.JPEG"); // 载入图片
Mat imgGray;
vector<Rect> faces;
if(img.empty())
{
return 1;
}
if(img.channels() ==3)
{
cvtColor(img, imgGray, CV_RGB2GRAY); // RGB转化为灰度
}
else
{
imgGray = img; // 不转化
}
faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0)); // 检测人脸
if(faces.size()>0)
{
for(int i =0; i<faces.size(); i++)
{
rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), Scalar(0, 255, 0), 1, 8); // 框出人脸
}
}
imshow("FacesOfPrettyGirl", img); // 显示图片
waitKey(0);
return 0;
}
编译运行:
二、视频(摄像头)中的人脸检测
视频中的人脸检测跟图片类似,一样的过程。
可将视频看作是一帧帧的图片,对每一帧进行上述的图片检测即可,不断循环。
代码实现:
#include<opencv2/objdetect/objdetect.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
CascadeClassifier faceCascade;
int main()
{
faceCascade.load("/root/library/opencv/opencv-3.4.0/data/haarcascades/haarcascade_frontalface_alt2.xml");
VideoCapture capture;
capture.open(1); // 打开摄像头
// capture.open("video.avi"); // 打开视频
if(!capture.isOpened())
{
cout << "open camera failed. " << endl;
return -1;
}
Mat img, imgGray;
vector<Rect> faces;
while(1)
{
capture >> img; // 读取图像至img
if(img.empty())
{
continue;
}
if(img.channels() == 3)
{
cvtColor(img, imgGray, CV_RGB2GRAY);
}
else
{
imgGray = img;
}
faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0)); // 检测人脸
if(faces.size()>0)
{
for(int i =0; i<faces.size(); i++)
{
rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), Scalar(0, 255, 0), 1, 8);
}
}
imshow("CamerFace", img); // 显示
if(waitKey(1) > 0) // delay ms 等待按键退出
{
break;
}
}
return 0;
}
编译运行:
视频有点卡顿,后续优化。
优化参考:
博客:【opencv视频流(摄像头)的人脸检测的优化】
备注:参考博客 http://blog.csdn.net/lsq2902101015/article/details/47057081 http://blog.csdn.net/chaipp0607/article/details/54234663
最后
以上就是负责牛排为你收集整理的opencv实现图片及视频流(摄像头)的人脸检测的全部内容,希望文章能够帮你解决opencv实现图片及视频流(摄像头)的人脸检测所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复