基于Opencv的人脸检测源程序(附详细使用说明)

合集下载

关于Opencv实现人脸检测的阐述

关于Opencv实现人脸检测的阐述

关于Opencv实现人脸检测的阐述最近用Opencv开发一个人脸检测的小程序,结构并不复杂,但对于Opencv初学者来说还是具有一定的引导意义。

接下来对于程序开发中出现的一些问题进行简单讨论。

一、图像采集。

图像既可以从摄像头设备中读取,也可以从磁盘中加载,两者方法大同小异。

以摄像头为例,Opencv对于摄像头的操作同matlab中一样,是通过一个简单的API 函数实现的,具体如下:CvCapture* m_pCapture;m_pCapture = cvCreateCameraCapture(0);IplImage* m_pFrameImage;m_pFrameImage = cvQueryFrame(m_pCapture);首先是创建一个视频流结构体指针m_pCapture,之后调用cvCreateCameraCapture(0)函数将结构体与相应视频输入设备关联,若只有一个视频输入设备(如笔记本摄像头),建议参数给0,若有多个视频设备则应给对应的ID号。

关联完成后,调用cvQueryFrame(m_pCapture);得到m_pCapture结构体中视频流的下一帧图像,存储在图像指针对应的区域,至此,完成摄像头图像采集。

从磁盘中读取图像过程相对复杂一点,需要用到MFC中关于文件及文件夹读取的知识。

具体讲用两条途径,一是定位指定文件夹,继而读取文件夹下的所有图像文件;二是直接定位文件,继而读取相应文件。

读取文件夹的具体代码如下:BROWSEINFO bi;//用来存储用户选中的目录信息TCHAR name[MAX_PATH];//存储路径name[0]='d';ZeroMemory(&bi,sizeof(BROWSEINFO));//清空目录对应的内存bi.hwndOwner=GetSafeHwnd();//得到窗口句柄bi.pszDisplayName=name;BIF_BROWSEINCLUDEFILES;//这句话是什么意思bi.lpszTitle=_T("Select folder");//对话框标题bi.ulFlags=0x80;//设置对话框形式LPITEMIDLIST idl=SHBrowseForFolder(&bi);//返回所选中文件夹的IDif(idl==NULL)return;SHGetPathFromIDList(idl,str.GetBuffer(MAX_PATH));//将文件信息格式化存储到对应缓冲区中str.ReleaseBuffer();//与GerBuffer配合使用,清空内存m_Path=str;//将路径存储在m_path中if(str.GetAt(str.GetLength()-1)!='\\')m_Path+="\\";UpdateData(FALSE);文件夹读取过程中关键函数为SHBrowseForFolder,这个函数有什么样作用以及具体用法网上都有具体的帖子和博客进行说明,这里不做赘述,最终文件夹路径存储在变量m_Path中。

OpenCV实现人脸检测功能

OpenCV实现人脸检测功能

OpenCV实现⼈脸检测功能本⽂实例为⼤家分享了OpenCV实现⼈脸检测功能的具体代码,供⼤家参考,具体内容如下1、HAAR级联检测#include <opencv2/opencv.hpp>#include <iostream>using namespace cv;#include <iostream>#include <cstdlib>using namespace std;int main(int artc, char** argv) {face_detect_haar();waitKey(0);return 0;}void face_detect_haar() {CascadeClassifier faceDetector;std::string haar_data_file = "./models/haarcascades/haarcascade_frontalface_alt_tree.xml";faceDetector.load(haar_data_file);vector<Rect> faces;//VideoCapture capture(0);VideoCapture capture("./video/test.mp4");Mat frame, gray;int count=0;while (capture.read(frame)) {int64 start = getTickCount();if (frame.empty()){break;}// ⽔平镜像调整// flip(frame, frame, 1);imshow("input", frame);if (frame.channels() == 4)cvtColor(frame, frame, COLOR_BGRA2BGR);cvtColor(frame, gray, COLOR_BGR2GRAY);equalizeHist(gray, gray);faceDetector.detectMultiScale(gray, faces, 1.2, 1, 0, Size(30, 30), Size(400, 400));for (size_t t = 0; t < faces.size(); t++) {count++;rectangle(frame, faces[t], Scalar(0, 255, 0), 2, 8, 0);}float fps = getTickFrequency() / (getTickCount() - start);ostringstream ss;ss.str("");ss << "FPS: " << fps << " ; inference time: " << time << " ms";putText(frame, ss.str(), Point(20, 20), 0, 0.75, Scalar(0, 0, 255), 2, 8);imshow("haar_face_detection", frame);if (waitKey(1) >= 0) break;}printf("total face: %d\n", count);}2、 DNN⼈脸检测#include <opencv2/dnn.hpp>#include <opencv2/opencv.hpp>using namespace cv;using namespace cv::dnn;#include <iostream>#include <cstdlib>using namespace std;const size_t inWidth = 300;const size_t inHeight = 300;const double inScaleFactor = 1.0;const Scalar meanVal(104.0, 177.0, 123.0);const float confidenceThreshold = 0.7;void face_detect_dnn();void mtcnn_demo();int main(int argc, char** argv){face_detect_dnn();waitKey(0);return 0;}void face_detect_dnn() {//这⾥采⽤tensorflow模型std::string modelBinary = "./models/dnn/face_detector/opencv_face_detector_uint8.pb"; std::string modelDesc = "./models/dnn/face_detector/opencv_face_detector.pbtxt";// 初始化⽹络dnn::Net net = readNetFromTensorflow(modelBinary, modelDesc);net.setPreferableBackend(DNN_BACKEND_OPENCV);net.setPreferableTarget(DNN_TARGET_CPU);if (net.empty()){printf("Load models fail...\n");return;}// 打开摄像头// VideoCapture capture(0);VideoCapture capture("./video/test.mp4");if (!capture.isOpened()) {printf("Don't find video...\n");return;}Mat frame;int count=0;while (capture.read(frame)) {int64 start = getTickCount();if (frame.empty()){break;}// ⽔平镜像调整// flip(frame, frame, 1);imshow("input", frame);if (frame.channels() == 4)cvtColor(frame, frame, COLOR_BGRA2BGR);// 输⼊数据调整Mat inputBlob = blobFromImage(frame, inScaleFactor,Size(inWidth, inHeight), meanVal, false, false);net.setInput(inputBlob, "data");// ⼈脸检测Mat detection = net.forward("detection_out");vector<double> layersTimings;double freq = getTickFrequency() / 1000;double time = net.getPerfProfile(layersTimings) / freq;Mat detectionMat(detection.size[2], detection.size[3], CV_32F, detection.ptr<float>()); ostringstream ss;for (int i = 0; i < detectionMat.rows; i++){// 置信度 0~1之间float confidence = detectionMat.at<float>(i, 2);if (confidence > confidenceThreshold){count++;int xLeftBottom = static_cast<int>(detectionMat.at<float>(i, 3) * frame.cols);int yLeftBottom = static_cast<int>(detectionMat.at<float>(i, 4) * frame.rows);int xRightTop = static_cast<int>(detectionMat.at<float>(i, 5) * frame.cols);int yRightTop = static_cast<int>(detectionMat.at<float>(i, 6) * frame.rows);Rect object((int)xLeftBottom, (int)yLeftBottom,(int)(xRightTop - xLeftBottom),(int)(yRightTop - yLeftBottom));rectangle(frame, object, Scalar(0, 255, 0));ss << confidence;std::string conf(ss.str());std::string label = "Face: " + conf;int baseLine = 0;Size labelSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);rectangle(frame, Rect(Point(xLeftBottom, yLeftBottom - labelSize.height),Size(labelSize.width, labelSize.height + baseLine)),Scalar(255, 255, 255), FILLED);putText(frame, label, Point(xLeftBottom, yLeftBottom),FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0));}}float fps = getTickFrequency() / (getTickCount() - start);ss.str("");ss << "FPS: " << fps << " ; inference time: " << time << " ms";putText(frame, ss.str(), Point(20, 20), 0, 0.75, Scalar(0, 0, 255), 2, 8);imshow("dnn_face_detection", frame);if (waitKey(1) >= 0) break;}printf("total face: %d\n", count);}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

【转载】opencv实现人脸检测

【转载】opencv实现人脸检测

【转载】opencv实现⼈脸检测全⽂转载⾃CSDN的博客(不知道怎么将CSDN的博客转到博客园,应该没这功能吧,所以直接复制全⽂了),转载地址如下本篇⽂章主要介绍了如何使⽤OpenCV实现⼈脸检测。

本⽂不具体讲解⼈脸检测的原理,直接使⽤OpenCV实现。

OpenCV版本:2.4.10;VS开发版本:VS2012。

⼀、OpenCV⼈脸检测要实现⼈脸识别功能,⾸先要进⾏⼈脸检测,判断出图⽚中⼈脸的位置,才能进⾏下⼀步的操作。

1、OpenCV⼈脸检测的⽅法在OpenCV中主要使⽤了两种特征(即两种⽅法)进⾏⼈脸检测,Haar特征和LBP特征。

在OpenCV中,使⽤已经训练好的XML格式的分类器进⾏⼈脸检测。

在OpenCV的安装⽬录下的sources⽂件夹⾥的data⽂件夹⾥可以看到下图所⽰的内容:上图中⽂件夹的名字“haarcascades”、“hogcascades”和“lbpcascades”分别表⽰通过“haar”、“hog”和“lbp”三种不同的特征⽽训练出的分类器:即各⽂件夹⾥的⽂件。

"haar"特征主要⽤于⼈脸检测,“hog”特征主要⽤于⾏⼈检测,“lbp”特征主要⽤于⼈脸识别。

打开“haarcascades”⽂件夹,如下图所⽰图中的XML⽂件即是我们⼈脸检测所需要的分类器⽂件。

在实际使⽤中,推荐使⽤上图中被标记的“haarcascade_frontalface_alt2.xml”分类器⽂件,准确率和速度都⽐较好。

2、OpenCV中的⼈脸检测的类在OpenCV中,使⽤类“CascadeClassifier”进⾏⼈脸检测CascadeClassifier faceCascade; //实例化对象所需要使⽤的函数:faceCascade.load("../data/haarcascade_frontalface_alt2"); //加载分类器faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0)); //多尺⼨检测⼈脸实现⼈脸检测主要依赖于detectMultiScale()函数,下⾯简单说⼀下函数参数的含义,先看函数原型:1. CV_WRAP virtual void detectMultiScale( const Mat& image,2. CV_OUT vector<Rect>& objects,3. double scaleFactor=1.1,4. int minNeighbors=3, int flags=0,5. Size minSize=Size(),6. Size maxSize=Size() );各参数含义:const Mat& image: 需要被检测的图像(灰度图)vector<Rect>& objects: 保存被检测出的⼈脸位置坐标序列double scaleFactor: 每次图⽚缩放的⽐例int minNeighbors: 每⼀个⼈脸⾄少要检测到多少次才算是真的⼈脸int flags:决定是缩放分类器来检测,还是缩放图像Size(): 表⽰⼈脸的最⼤最⼩尺⼨⼆、代码实现1、检测图⽚中的⼈脸#include<opencv2/objdetect/objdetect.hpp>#include<opencv2/highgui/highgui.hpp>#include<opencv2/imgproc/imgproc.hpp>using namespace cv;//⼈脸检测的类CascadeClassifier faceCascade;int main(){faceCascade.load("../data/haarcascade_frontalface_alt2.xml"); //加载分类器,注意⽂件路径Mat img = imread("../data/PrettyGirl.jpg");Mat imgGray;vector<Rect> faces;if(img.empty()){return1;}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("FacesOfPrettyGirl", img);waitKey(0);return0;}结果如下图:2、检测视频中的⼈脸//头⽂件#include<opencv2/objdetect/objdetect.hpp>#include<opencv2/highgui/highgui.hpp>#include<opencv2/imgproc/imgproc.hpp>using namespace cv;//⼈脸检测的类CascadeClassifier faceCascade;int main(){faceCascade.load("../data/haarcascade_frontalface_alt2.xml"); //加载分类器,注意⽂件路径VideoCapture cap;cap.open(0); //打开摄像头//cap.open("../data/test.avi"); //打开视频Mat img, imgGray;vector<Rect> faces;int c = 0;if(!cap.isOpened()){return1;}while(c!=27)cap>>img;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("Camera", img);c = waitKey(1);}return0;}在视频实时检测时,可能会出现卡顿,是因为检测⼈脸花费了过多的时间,这⾥代码只实现基本功能,并未优化。

基于opencv的人脸识别程序-代码详解

基于opencv的人脸识别程序-代码详解

#include "cv.h"#include "highgui.h"#include <stdio.h>#ifdef _EiC#define WIN32#endifstatic CvMemStorage* storage = 0;static CvHaarClassifierCascade* cascade = 0;void detect_and_draw( IplImage* image );const char* cascade_name ="haarcascade_frontalface_alt.xml";//人脸检测分类器int main( int argc, char** argv ){CvCapture* capture = 0;IplImage *frame, *frame_copy = 0;int optlen = strlen("--cascade=");const char* input_name;if( argc > 1 && strncmp( argv[1], "--cascade=", optlen ) == 0 ){cascade_name = argv[1] + optlen;input_name = argc > 2 ? argv[2] : 0;}else{cascade_name = "E:\毕业设计\智能机器人动态人脸识别系统\陈建州程序.xml";//分类器路径input_name = argc > 1 ? argv[1] : 0;}cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );if( !cascade )//如果没有找到分类器,输出以下{fprintf( stderr, "ERROR: Could not load classifier cascade\n" );fprintf( stderr,"Usage: facedetect --cascade=\"<cascade_path>\" [filename|camera_index]\n" );return -1;}storage = cvCreateMemStorage(0);capture = cvCaptureFromCAM( !input_name ? 0 : input_name[0] - '0' );//读取摄像头if(!capture)//如果没有摄像头读取视频文件capture = cvCaptureFromA VI("检测.avi");cvNamedWindow( "result", 1);//创建窗口if( capture ){for(;;){if( !cvGrabFrame( capture ))//从摄像头中抓取帧break;frame = cvRetrieveFrame( capture );//读取上边抓取的帧if( !frame )break;if( !frame_copy )frame_copy = cvCreateImage( cvSize(frame->width,frame->height),IPL_DEPTH_8U, frame->nChannels );if( frame->origin == IPL_ORIGIN_TL )cvCopy( frame, frame_copy, 0 );elsecvFlip( frame, frame_copy, 0 );detect_and_draw( frame_copy );if( cvWaitKey( 10 ) >= 0 )break;}cvReleaseImage( &frame_copy );cvReleaseCapture( &capture );}else//没检测到视频文件或者摄像头{const char* filename = (char*)"检测.jpg";//读图片IplImage* image = cvLoadImage( filename, 1 );if( image ){detect_and_draw( image );cvWaitKey(0);cvReleaseImage( &image );}else{FILE* f = fopen( filename, "rt" );if( f ){char buf[1000+1];while( fgets( buf, 1000, f ) ){int len = (int)strlen(buf);while( len > 0 && isspace(buf[len-1]) )len--;buf[len] = '\0';image = cvLoadImage( buf, 1 );if( image ){detect_and_draw( image );cvWaitKey(0);cvReleaseImage( &image );}}fclose(f);}}}cvDestroyWindow("result");return 0;}void detect_and_draw( IplImage* img ){static CvScalar colors[] ={{{0,0,255}},{{0,128,255}},{{0,255,255}},{{0,255,0}},{{255,128,0}},{{255,255,0}},{{255,0,0}},{{255,0,255}}};double scale = 1.3;IplImage* gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 );IplImage* small_img = cvCreateImage( cvSize( cvRound (img->width/scale),cvRound (img->height/scale)),8, 1 );int i;cvCvtColor( img, gray, CV_BGR2GRAY );cvResize( gray, small_img, CV_INTER_LINEAR );cvEqualizeHist( small_img, small_img );cvClearMemStorage( storage );if( cascade ){double t = (double)cvGetTickCount();CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/,cvSize(30, 30) );//检测人脸返回矩形人脸t = (double)cvGetTickCount() - t;printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) );for( i = 0; i < (faces ? faces->total : 0); i++ )//找到矩形中心,把矩形转化为圆形{CvRect* r = (CvRect*)cvGetSeqElem( faces, i );CvPoint center;int radius;center.x = cvRound((r->x + r->width*0.5)*scale);center.y = cvRound((r->y + r->height*0.5)*scale);radius = cvRound((r->width + r->height)*0.25*scale);cvCircle( img, center, radius, colors[i%8], 3, 8, 0 );}}cvShowImage( "result", img );cvReleaseImage( &gray );cvReleaseImage( &small_img );}OpenCV的人脸检测主要是调用训练好的cascade(Haar分类器)来进行模式匹配。

opencv python 人脸 detectmultiscale 参数

opencv python 人脸 detectmultiscale 参数

opencv python 人脸detectmultiscale 参数在Python中使用OpenCV库进行人脸检测时,`detectMultiScale`函数是一个常用的方法。

这个函数可以从图像中检测出多个人脸,并返回每个脸部的位置和大小。

函数的基本用法如下:```pythonimport cv2# 加载Haar分类器face_cascade = cv2.CascadeClassifier('/path/to/haarcascade_frontalface_default.xml')# 读取图像img = cv2.imread('path/to/image.jpg')# 将图像转换为灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 调用detectMultiScale函数检测人脸faces = face_cascade.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=5,minSize=(30, 30),flags=cv2.CASCADE_SCALE_IMAGE)# 打印检测到的人脸数量print("Detected {0} faces!".format(len(faces)))# 循环遍历检测到的人脸for (x, y, w, h) in faces:# 绘制人脸矩形cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)# 显示图像cv2.imshow('img', img)cv2.waitKey()```函数`detectMultiScale`的参数意义如下:- `gray`:必须是灰度图像。

- `scaleFactor`:图像缩放比例,用来调整检测人脸的大小,默认为1.1。

python基于opencv实现人脸识别

python基于opencv实现人脸识别

python基于opencv实现⼈脸识别将opencv中haarcascade_frontalface_default.xml⽂件下载到本地,我们调⽤它辅助进⾏⼈脸识别。

识别图像中的⼈脸#coding:utf-8import cv2 as cv# 读取原始图像img = cv.imread('face.png')# 调⽤熟悉的⼈脸分类器识别特征类型# ⼈脸 - haarcascade_frontalface_default.xml# ⼈眼 - haarcascade_eye.xml# 微笑 - haarcascade_smile.xmlface_detect = cv.CascadeClassifier('haarcascade_frontalface_default.xml')gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# 检查⼈脸按照1.1倍放到周围最⼩像素为5face_zone = face_detect.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)print ('识别⼈脸的信息:',face_zone)# 绘制矩形和圆形检测⼈脸for x, y, w, h in face_zone:# 绘制矩形⼈脸区域 thickness表⽰线的粗细cv.rectangle(img, pt1=(x, y), pt2=(x+w, y+h),color=[0,0,255], thickness=2)# 绘制圆形⼈脸区域 radius表⽰半径cv.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=[0,255,0], thickness=2)# 设置图⽚可以⼿动调节⼤⼩dWindow("Easmount-CSDN", 0)# 显⽰图⽚cv.imshow("Easmount-CSDN", img)# 等待显⽰设置任意键退出程序cv.waitKey(0)cv.destroyAllWindows()注意,此算法只能检测正脸,并且任何算法都有⼀定的准确率。

基于OpenCV的人脸识别技术研究与实现(C语言)

基于OpenCV的人脸识别技术研究与实现(C语言)

基于OpenCV的人脸识别技术研究与实现(C语言)一、引言人脸识别技术是近年来备受关注的领域之一,随着计算机视觉和人工智能的发展,人脸识别技术在各个领域得到了广泛的应用。

本文将重点介绍基于OpenCV库的人脸识别技术研究与实现,使用C语言进行编程实现。

二、OpenCV简介OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法。

它支持多种编程语言,包括C++、Python等。

在本文中,我们将使用C语言结合OpenCV库来实现人脸识别技术。

三、人脸检测人脸检测是人脸识别技术的第一步,通过检测输入图像中的人脸位置来进行后续的识别工作。

OpenCV提供了Haar级联分类器来进行人脸检测,我们可以利用该分类器来实现简单而有效的人脸检测功能。

四、人脸特征提取在进行人脸识别之前,需要对检测到的人脸进行特征提取。

常用的方法包括主成分分析(PCA)和线性判别分析(LDA)等。

通过提取人脸的特征向量,可以将其表示为一个高维向量,便于后续的比对和识别。

五、人脸识别算法在得到人脸特征向量后,我们可以使用不同的算法来进行人脸识别。

常见的算法包括最近邻算法(KNN)、支持向量机(SVM)和深度学习方法等。

这些算法可以根据实际需求选择合适的模型进行训练和测试。

六、实验设计与实现在本节中,我们将介绍如何使用OpenCV库和C语言来实现基于人脸识别技术的实验。

首先,我们需要准备训练数据集和测试数据集,并对数据集进行预处理和特征提取。

然后,我们可以选择合适的算法模型进行训练,并对测试数据集进行验证和评估。

七、实验结果与分析通过实验我们可以得到不同算法在人脸识别任务上的表现结果,并对比它们的准确率、召回率等指标。

通过分析实验结果,可以帮助我们选择最适合当前任务需求的人脸识别算法,并对其性能进行优化和改进。

八、应用与展望人脸识别技术在安防监控、人机交互、身份认证等领域有着广泛的应用前景。

未来随着技术的不断发展,人脸识别技术将会变得更加智能化和便捷化,为社会生活带来更多便利。

android opencv facedetectyn 用法

android opencv facedetectyn 用法

android opencv facedetectyn 用法全文共四篇示例,供读者参考第一篇示例:Android中使用OpenCV进行人脸检测的方法是通过使用OpenCV库中的人脸检测算法来识别图像中的人脸。

OpenCV是一个开源的计算机视觉库,它提供了很多强大的图像处理和计算机视觉算法,包括人脸检测。

人脸检测是计算机视觉领域中的一个基础问题,它通常包括在一张图像中检测出所有的人脸,并标记出它们的位置。

人脸检测在很多应用中都被广泛使用,比如人脸识别、人脸表情识别、人脸跟踪等。

在Android应用中使用OpenCV进行人脸检测首先需要在项目中引入OpenCV库。

可以通过gradle添加依赖来引入OpenCV库,如下所示:implementation 'org.opencv:opencv-android:3.4.1'然后在代码中进行初始化OpenCV库,在Activity的onCreate 方法中调用OpenCVLoader.initDebug()方法进行初始化,如下所示:if (!OpenCVLoader.initDebug()) {Log.e("OpenCV", "初始化失败");} else {Log.d("OpenCV", "初始化成功");}}初始化成功后就可以使用OpenCV库中的人脸检测算法来进行人脸检测了。

OpenCV提供了CascadeClassifier类来实现人脸检测,它可以加载已经训练好的人脸检测器,如haarcascade_frontalface_default.xml。

在使用CascadeClassifier进行人脸检测时,首先需要创建一个CascadeClassifier对象并加载人脸检测器,如下所示:CascadeClassifier faceCascade = new CascadeClassifier();faceCascade.load(context.getResources().openRawResource(R.ra w.haarcascade_frontalface_default));然后可以使用CascadeClassifier的detectMultiScale方法来进行人脸检测,它会返回检测到的人脸的矩形区域。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于Opencv的人脸检测程序
我的电脑上是用visual studio 2015,配置opencv2.4.9,visuanl studio加载opencv的方法百度上可以找到很多,按照要求配置好后以后进行一下操作:
第一步:新建win32应用程序的工程,在该工程以下程序复杂被覆盖win32的几行程序,
#include"stdafx.h"
#include"opencv2/objdetect.hpp"
#include"opencv2/videoio.hpp"
#include"opencv2/highgui.hpp"
#include"opencv2/imgproc.hpp"
#include<iostream>
#include<stdio.h>
using namespace std;
using namespace cv;
/** Function Headers */
void detectAndDisplay(Mat frame);
/** Global variables */
String face_cascade_name = "haarcascade_frontalface_alt.xml";
String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
CascadeClassifier face_cascade;
CascadeClassifier eyes_cascade;
String window_name = "Capture - Face detection";
/** @function main */
int main(void)
{
VideoCapture capture;
Mat frame;
//-- 1. Load the cascades
if (!face_cascade.load(face_cascade_name)) { printf("--(!)Error loading face cascade\n"); return -1; };
if (!eyes_cascade.load(eyes_cascade_name)) { printf("--(!)Error loading eyes cascade\n"); return -1; };
//-- 2. Read the video stream
capture.open(-1);
if (!capture.isOpened()) { printf("--(!)Error opening video capture\n"); return -1; }
while (capture.read(frame))
{
if (frame.empty())
{
printf(" --(!) No captured frame -- Break!");
break;
}
//-- 3. Apply the classifier to the frame
detectAndDisplay(frame);
char c = (char)waitKey(10);
if (c == 27) { break; } // escape
}
return 0;
}
/** @function detectAndDisplay */
void detectAndDisplay(Mat frame)
{
std::vector<Rect> faces;
Mat frame_gray;
cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
equalizeHist(frame_gray, frame_gray);
//-- Detect faces
face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
for (size_t i = 0; i < faces.size(); i++)
{
Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);
ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);
Mat faceROI = frame_gray(faces[i]);
std::vector<Rect> eyes;
//-- In each face, detect eyes
eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
for (size_t j = 0; j < eyes.size(); j++)
{
Point eye_center(faces[i].x + eyes[j].x + eyes[j].width / 2, faces[i].y + eyes[j].y + eyes[j].height / 2);
int radius = cvRound((eyes[j].width + eyes[j].height)*0.25);
circle(frame, eye_center, radius, Scalar(255, 0, 0), 4, 8, 0);
}
}
//-- Show what you got
imshow(window_name, frame);
}
第二步:将haarcascade_eye_tree_eyeglasses.xml和haarcascade_frontalface_alt.xml两个文件放置在当前工程目录下
注意,这两个文件非常重要,少了两个文件程序无法正常运行,这两个文件是训练好的人脸数据。

限于百度文库只能上传文档,这两个文件无法在百度文库中上传,可以到CSDN下载中搜索这两个文件。

第三步:有了源程序,并且配置好了就可以直接进行运行了,注意:本程序是直接打开摄像头,可以同时检测摄像头前的多个人脸和人眼睛,人脸检测结果效果非常好。

下图是检测结果,
侧面检测人脸
正面检测人脸
检测到眼睛和人脸(即使有遮挡也可以检测)。

相关文档
最新文档