opencv 之人眼人脸检测

1、基于图片的人脸、人眼检测
原理: OpenCV利用样本的Haar特征进行分类器训练,得到级联boosted分类器(CascadeClassification),可以检测图片中的眼睛(还支持的有人脸、嘴、鼻子、身体)。

2. 我用时vs2015+opencv310(看了一下opencv3.4.1,人脸检测分类器是没有更新的)。

//#include "stdafx.h"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <cctype>
#include <iostream>
#include <iterator>
#include <stdio.h>

using namespace std;
using namespace cv;

//面部和眼睛检测并绘制矩形框,参数一次为图片数据,面部和眼部的级联分类器,检测时允许的图片缩小比例
void detectAndDraw(Mat& img, CascadeClassifier& faceCascade, CascadeClassifier& eyeCascade, double scale);
//脸部和眼部的训练数据,就是以xml文件的形式,存储了标准的用来比对的模特数据,文件放在了当前目录
//string faceCascadeName = "D:\\Opencv310\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml";
//眼部
//string eyeCascadeName = "D:\\Opencv310\\opencv\\sources\\data\\haarcascades\\haarcascade_eye.xml";
string faceCascadeName = 
//面部
"D:\\Opencv310\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_alt.xml";
string eyeCascadeName = "D:\\Opencv310\\opencv\\build\\etc\\haarcascades\\haarcascade_eye.xml";//眼部
//string eyeCascadeName = "D:\\Opencv310\\opencv\\build\\etc\\haarcascades\\cxml";
//haarcascade_eye_tree_eyeglasses

int main(int argc, const char** argv)
{
	Mat image;//opencv中存储数据的基本单位,存储帧,图片等,代替旧版本的IplImage
	string inputName("E:\\FaceImage\\single\\3g.jpg");//示例图片,放在当前目录
	CascadeClassifier faceCascade, eyeCascade;//定义级联分类器,由它们实现检测功能
	double scale = 1;//不缩小图片,这样可以提高准确率
	if (!faceCascade.load(faceCascadeName) || !eyeCascade.load(eyeCascadeName))//载入xml训练数据
	{
		return -1;
	}
	image = imread(inputName, CV_LOAD_IMAGE_COLOR);//读取图片,第二个参数说明是彩色图片
	
	if (!image.empty())
	{
		detectAndDraw(image, faceCascade, eyeCascade, scale);//进行识别
	}
	waitKey(0);//等待建入
	
	return 0;
}

void detectAndDraw(Mat& img, CascadeClassifier& faceCascade, CascadeClassifier& eyeCascade, double scale)
{
	int i = 0;
	double t = 0;
//用来存储检测出来的面部和眼部数据,我们无法确定个数,
//因此定义成vector
	vector<Rect> faces, eyes;
	Mat gray, smallImg(cvRound(img.rows / scale), cvRound(img.cols / scale), CV_8UC1);//smallImg已缩放
    //因为用的是类haar特征,所以都是基于灰度图像的
	cvtColor(img, gray, CV_BGR2GRAY);//);
	//将灰色图像适应大小到smallImg中
    resize(gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR);
    //加强对比度,提高检测准确率
	equalizeHist(smallImg, smallImg);

	t = (double)cvGetTickCount();//获取当前时间
  //使用级联分类器进行识别,参数为灰度图片,面部数组,检测单元的增长率,
   //是否融合检测出的矩形,最小检测单元大小
  // smallImg表示的是要检测的输入图像为smallImg,
  //faces表示检测到的人脸目标序列
  //每次图像尺寸减小的比例为1.1表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1
   //即每次搜索窗口依次扩大10%;一般设置为1.1  
  // 2表示每一个目标至少要被检测到3次才算是真的目标
  //CV_HAAR_SCALE_IMAGE表示不是缩放分类器来检测,而是缩放图像,
  // Size(5, 5)为目标的 最小最大尺寸

 
faceCascade.detectMultiScale(smallImg, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
	for (vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++)
	{
        //在img上绘制出检测到的面部矩形框,绿色框  
		rectangle(img, *r, Scalar(0, 255, 0), 1, 1, 0);
       //设置图片感兴趣区域,也就是改变了图片原点和长宽,实际像素数据没有丢失
		Mat faceROI = smallImg(*r);
		eyeCascade.detectMultiScale(faceROI, eyes, 1.2, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
		//eyeCascade.detectMultiScale(smallImg, eyes, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
		for (vector<Rect>::const_iterator e = eyes.begin(); e != eyes.end(); e++)
		{
			Rect eyeR;
			eyeR.x = r->x + e->x;//从感兴趣区域映射到整个图片区域
			eyeR.y = r->y + e->y;
			eyeR.height = e->height;
			eyeR.width = e->width;
          //绘制检测到的眼睛矩形框,黄色框
			cv::rectangle(img, eyeR, Scalar(0, 255, 255), 1, 1, 0);

		}
	}
	t = (double)cvGetTickCount() - t;//获取当前时间
    //转化成毫秒打印
	printf("detection time = %g ms\n", t / ((double)cvGetTickFrequency()*1000.));
	imshow("result", img);//将img显示到result窗口
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Opencv人眼检测是通过使用Haar特征进行分类器训练,得到级联boosted分类器(CascadeClassification)来实现的。这个分类器可以用于检测图片中的眼睛。具体的实现步骤如下:首先,读取图片并将其转换为灰度图像。然后,使用人脸检测器识别出人脸区域,并在图像上绘制人脸矩形框。接下来,使用人眼检测器识别出人眼区域,并在图像上绘制人眼矩形框。最后,显示图片并等待用户关闭窗口。这样就可以实现Opencv人眼检测。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [OPENCV人眼检测](https://blog.csdn.net/u011345885/article/details/50741748)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【OpenCV人脸检测】4. 绘制人脸与人眼区域](https://blog.csdn.net/qq_44431690/article/details/106061162)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [opencv人眼人脸检测](https://blog.csdn.net/Alisa_xf/article/details/81586313)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值