OpenCV人脸检测(完整源码+思路)

本博文IDE为vs2013

OpenCV2.49

话不多说,先看视频演示(20S演示):

如下:

https://v.youku.com/v_show/id_XMjYzMzkxMTYyMA==.html?spm=a2h0w.8278793.2736843.4#paction

程序截图如下:

如何来用OpenCV来实现能。

下面给出OpenCV实现人脸检测的一般步骤:

1.加载人脸检测器

2.开启摄像头

3.对图片进行灰度处理(其实可以不处理,上图中原图的标题栏就是未进行灰度处理进行的检测,这里的灰度是为下节人脸识别打基础)

4.对图片进行直方图均衡化(其实可以不处理,上图中原图的标题栏就是未进行灰度处理进行的检测和灰度图是为进行均衡化识别,这里的均衡化是为下节人脸识别打基础)

5.人脸检测

总结下,如果单单只要人脸检测,可以的步骤是1,2,5

本博客把1,2,5,

1,2,3,5

1,2,3,4,5

都演示了出来。

下面是完整的代码,本代码还有大量注释,在此不再具体说明哪个函数有什么用。

下面上源码:

#include <opencv.hpp>
#include <opencv2/core/core.hpp>
#include <iostream>

using namespace cv;

void Pic2Gray(Mat camerFrame,Mat &gray)
{
	//普通台式机3通道BGR,移动设备为4通道
	if (camerFrame.channels() == 3)
	{
		cvtColor(camerFrame, gray, CV_BGR2GRAY);
	}
	else if (camerFrame.channels() == 4)
	{
		cvtColor(camerFrame, gray, CV_BGRA2GRAY);
	}
	else
		gray = camerFrame;
}

int main()
{
	//加载Haar或LBP对象或人脸检测器
	CascadeClassifier faceDetector;
	std::string faceCascadeFilename = "haarcascade_frontalface_default.xml";

	//友好错误信息提示
	try{
		faceDetector.load(faceCascadeFilename);
	}
	catch (cv::Exception e){}
	if (faceDetector.empty())
	{
		std::cerr << "脸部检测器不能加载 (";
		std::cerr << faceCascadeFilename << ")!" << std::endl;
		exit(1);
	}

	//打开摄像头
	VideoCapture camera(0);
	while (true)
	{
		Mat camerFrame;
		camera >> camerFrame;
		if (camerFrame.empty())
		{
			std::cerr << "无法获取摄像头图像" << std::endl;
			getchar();
			exit(1);
		}
		Mat displayedFrame(camerFrame.size(),CV_8UC3);

		//人脸检测只试用于灰度图像
		Mat gray;
		Pic2Gray(camerFrame, gray);

		//直方图均匀化(改善图像的对比度和亮度)
		Mat equalizedImg;
		equalizeHist(gray, equalizedImg);

		//人脸检测用Cascade Classifier::detectMultiScale来进行人脸检测

		int flags = CASCADE_FIND_BIGGEST_OBJECT|CASCADE_DO_ROUGH_SEARCH;	//只检测脸最大的人
		//int flags = CASCADE_SCALE_IMAGE;	//检测多个人
		Size minFeatureSize(30, 30);
		float searchScaleFactor = 1.1f;
		int minNeighbors = 4;
		std::vector<Rect> faces;
		faceDetector.detectMultiScale(equalizedImg, faces, searchScaleFactor, minNeighbors, flags, minFeatureSize);

		//画矩形框
		cv::Mat face;
		cv::Point text_lb;
		for (size_t i = 0; i < faces.size(); i++)
		{
			if (faces[i].height > 0 && faces[i].width > 0)
			{
				face = gray(faces[i]);
				text_lb = cv::Point(faces[i].x, faces[i].y);
				cv::rectangle(equalizedImg, faces[i], cv::Scalar(255, 0, 0), 1, 8, 0);
				cv::rectangle(gray, faces[i], cv::Scalar(255, 0, 0), 1, 8, 0);
				cv::rectangle(camerFrame, faces[i], cv::Scalar(255, 0, 0), 1, 8, 0);
			}
		}

		imshow("直方图均匀化", equalizedImg);
		imshow("灰度化", gray);
		imshow("原图", camerFrame);

		waitKey(20);
	}

	getchar();
	return 0;
}
时间: 2024-08-18 22:35:12

OpenCV人脸检测(完整源码+思路)的相关文章

【计算机视觉】OpenCV人脸识别facerec源码分析1——FaceRecognizer概述

FaceRecognizer类 OpenCV中所有人脸识别的模型都是继承自FaceRecognizer这个基类,这个类提供了人脸识别算法的统一接口. class FaceRecognizer : public Algorithm { public: //! virtual destructor virtual ~FaceRecognizer() {} // Trains a FaceRecognizer. virtual void train(InputArray src, InputArray

【计算机视觉】OpenCV人脸识别facerec源码分析2——LBPH概述

人脸识别 从OpenCV2.4开始,加入了新的类FaceRecognizer,我们可以使用它便捷地进行人脸识别实验.其源代码可以在OpenCV中的opencv\modules\contrib\doc\facerec\src下找到. 目前支持的算法有: Eigenfaces特征脸createEigenFaceRecognizer() Fisherfaces createFisherFaceRecognizer() Local Binary Patterns Histograms局部二值直方图 cr

Android静态图片人脸识别的完整demo(附完整源码)

Demo功能:利用android自带的人脸识别进行识别,标记出眼睛和人脸位置.点击按键后进行人脸识别,完毕后显示到imageview上. 第一部分:布局文件activity_main.xml [html] view plaincopyprint? <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.co

分享我写的IOCP:源码+思路

首先说明,下面的代码仅是一个IOCP的demo,很多地方的设计非常差,当然也有一些设计还算可以:).此篇仅供对IOCP有些了解但又不深入的.需要一个稍微完整示例的.对网络编程感兴趣的同学参考.点击这里下载代码 整个程序的流程如下: 流程完全是无阻塞的,主线程里,将收到的消息全都一次性取出后,然后派发.所有欲发送的消息都缓存起来,等到更新的时候一起发送.有些地方代码没有完善,比如断开连接后,socket.内存等资源的关闭回收.要注意MAXRECEIVEDBUFFLENGTH这个宏,它是定义每个so

ASP.NET CORE小试牛刀:干货(完整源码)

扯淡 .NET Core 的推出让开发者欣喜万分,从封闭到拥抱开源十分振奋人心.对跨平台的支持,也让咱.NET开发者体验了一把 Write once,run any where 的感觉!近期离职后,时间比较充裕,我也花了些时间学习了 ASP.NET Core 开发,并且成功将之前的一个小网站 www.52chloe.com 极其后台管理移植成 ASP.NET Core,并部署到 linux 上.项目完整源码已经提交到 github,感兴趣的可以看看,希望对大家有用. 项目介绍 前端以 MVVM

OpenCV人脸检测(C++代码)

OpenCV人脸检测(C++代码)-- By wepon 这篇文章简单总结一下人脸检测的代码实现,基于OpenCV,C++版本.之所以强调C++版本是因为OpenCV有很多其他语言的接口,之前我也写过人脸检测的Python实现<Python-OpenCV人脸检测(代码)>,这篇文章则讲C++实现,其实大同小异,C++相比于Python实现代码写起来会繁琐一点,这也是语言本身决定的吧. 为了保持代码风格一致,C++实现与之前的Python实现一样,都将人脸检测.眼睛检测.框出人脸.框出眼睛.截取

微信小程序 授权登录详解(附完整源码)

一.前言 由于微信官方修改了 getUserInfo 接口,所以现在无法实现一进入微信小程序就弹出授权窗口,只能通过 button 去触发. 官方连接:https://developers.weixin.qq.com/community/develop/doc/0000a26e1aca6012e896a517556c01 二.实现思路 自己写一个微信授权登录页面让用户实现点击的功能,也就是实现了通过 button 组件去触发 getUserInof 接口.在用户进入微信小程序的时候,判断用户是否

Android OpenGL入门示例:绘制三角形和正方形 (附完整源码)

Android上对OpenGl的支持是无缝的,所以才有众多3D效果如此逼真的游戏,在Camera的一些流程中也有用到GLSurfaceView的情况.本文记录OpenGL在Android上的入门级示例,绘制一个三角形和正方形.尽管功能简单,可是我捣腾了好几个晚上,大量网上文章上的代码都有点问题,不是绘制不出来就是挂了. 第一个文件:MainActivity.java package com.example.learnopengl1; import android.opengl.GLSurface

ajaxFileupload的源码思路分析

? 1 ajaxfileupload源码: jQuery.extend({ //创建一个临时的iframe; createUploadIframe: function(id, uri) { //create frame var frameId = 'jUploadFrame' + id; var iframeHtml = '<iframe id="' + frameId + '" name="' + frameId + '" style="posit