opencv实现图片及视频流(摄像头)的人脸检测

完整人脸识别系统(源码+教程+环境):

开源毕业设计:基于嵌入式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

  • 13
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,我知道了。对于这个问题,你可以按照以下步骤来实现: 1. 首先,你需要安装OpenCV并配置Java环境。你可以从OpenCV的官方网站下载最新版本的OpenCV,并按照官方文档进行安装和配置。 2. 接下来,你需要使用Java代码来调用摄像头。你可以使用OpenCV中的VideoCapture类来打开摄像头并捕获视频流。以下是一个示例代码片段: ``` VideoCapture camera = new VideoCapture(0); // 打开摄像头,0表示默认的摄像头 if (!camera.isOpened()) { // 检查摄像头是否成功打开 System.out.println("无法打开摄像头"); return; } Mat frame = new Mat(); // 创建一个Mat对象,用于存储每一帧图像 while (true) { camera.read(frame); // 读取一帧图像 // 在这里添加对图像的处理代码,例如人脸检测等 imshow("Camera", frame); // 显示图像 if (waitKey(30) == 27) { // 按下ESC键退出循环 break; } } camera.release(); // 释放摄像头资源 ``` 3. 最后,你需要在代码中添加对人脸的识别处理。你可以使用OpenCV中的CascadeClassifier类来加载Haar特征分类器,并调用它的detectMultiScale方法来进行人脸检测。以下是一个示例代码片段: ``` CascadeClassifier cascade = new CascadeClassifier("haarcascade_frontalface_alt.xml"); // 加载Haar特征分类器 Mat gray = new Mat(); // 创建一个Mat对象,用于存储灰度图像 cvtColor(frame, gray, COLOR_BGR2GRAY); // 将彩色图像转换为灰度图像 equalizeHist(gray, gray); // 直方图均衡化 Rect[] faces = new Rect[0]; cascade.detectMultiScale(gray, faces, 1.1, 3, 0, new Size(30, 30), new Size(0, 0)); // 进行人脸检测 for (Rect face : faces) { rectangle(frame, face, new Scalar(0, 0, 255), 2); // 在图像上绘制矩形框 } ``` 这样,你就可以实现Java调用摄像头并动态识别人脸了。需要注意的是,以上示例代码仅供参考,具体实现可能需要根据你的具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值