基于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实现⼈脸检测功能的具体代码,供⼤家参考,具体内容如下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实现⼈脸检测全⽂转载⾃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的人脸识别程序-代码详解
#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 参数在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实现⼈脸识别将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简介OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法。
它支持多种编程语言,包括C++、Python等。
在本文中,我们将使用C语言结合OpenCV库来实现人脸识别技术。
三、人脸检测人脸检测是人脸识别技术的第一步,通过检测输入图像中的人脸位置来进行后续的识别工作。
OpenCV提供了Haar级联分类器来进行人脸检测,我们可以利用该分类器来实现简单而有效的人脸检测功能。
四、人脸特征提取在进行人脸识别之前,需要对检测到的人脸进行特征提取。
常用的方法包括主成分分析(PCA)和线性判别分析(LDA)等。
通过提取人脸的特征向量,可以将其表示为一个高维向量,便于后续的比对和识别。
五、人脸识别算法在得到人脸特征向量后,我们可以使用不同的算法来进行人脸识别。
常见的算法包括最近邻算法(KNN)、支持向量机(SVM)和深度学习方法等。
这些算法可以根据实际需求选择合适的模型进行训练和测试。
六、实验设计与实现在本节中,我们将介绍如何使用OpenCV库和C语言来实现基于人脸识别技术的实验。
首先,我们需要准备训练数据集和测试数据集,并对数据集进行预处理和特征提取。
然后,我们可以选择合适的算法模型进行训练,并对测试数据集进行验证和评估。
七、实验结果与分析通过实验我们可以得到不同算法在人脸识别任务上的表现结果,并对比它们的准确率、召回率等指标。
通过分析实验结果,可以帮助我们选择最适合当前任务需求的人脸识别算法,并对其性能进行优化和改进。
八、应用与展望人脸识别技术在安防监控、人机交互、身份认证等领域有着广泛的应用前景。
未来随着技术的不断发展,人脸识别技术将会变得更加智能化和便捷化,为社会生活带来更多便利。
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方法来进行人脸检测,它会返回检测到的人脸的矩形区域。
手把手教你如何用OpenCV+Python实现人脸识别
⼿把⼿教你如何⽤OpenCV+Python实现⼈脸识别。
于是迫不及待的想体验⼀下opencv的⼈脸识别,如下⽂。
下午的时候,配好了OpenCV的Python环境,环境,。
于是迫不及待的想体验⼀下必备知识Haar-like通俗的来讲,就是作为⼈脸特征即可。
Haar特征值反映了图像的灰度变化情况。
例如:脸部的⼀些特征能由矩形特征简单的描述,如:眼睛要⽐脸颊颜⾊要深,⿐梁两侧⽐⿐梁颜⾊要深,嘴巴⽐周围颜⾊要深等。
opencv api要想使⽤opencv,就必须先知道其能⼲什么,怎么做。
于是API的重要性便体现出来了。
就本例⽽⾔,使⽤到的函数很少,也就普通的读取图⽚,灰度转换,显⽰图像,简单的编辑图像罢了。
如下:读取图⽚只需要给出待操作的图⽚的路径即可。
import cv2image = cv2.imread(imagepath)灰度转换灰度转换的作⽤就是:转换成灰度的图⽚的计算强度得以降低。
import cv2gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)画图opencv 的强⼤之处的⼀个体现就是其可以对图⽚进⾏任意编辑,处理。
下⾯的这个函数最后⼀个参数指定的就是画笔的⼤⼩。
import cv2cv2.rectangle(image,(x,y),(x+w,y+w),(0,255,0),2)显⽰图像编辑完的图像要么直接的被显⽰出来,要么就保存到物理的存储介质。
import cv2cv2.imshow("Image Title",image)获取⼈脸识别训练数据看似复杂,其实就是对于⼈脸特征的⼀些描述,这样opencv在读取完数据后很据训练中的样品数据,就可以感知读取到的图⽚上的特征,进⽽对图⽚进⾏⼈脸识别。
import cv2face_cascade = cv2.CascadeClassifier(r'./haarcascade_frontalface_default.xml')⾥卖弄的这个xml⽂件,就是opencv在GitHub上共享出来的具有普适的训练好的数据。
人工智能-OpenCVPython实现人脸识别(人脸检测)
人工智能-OpenCVPython实现人脸识别(人脸检测)在OpenCV中使用Haar特征检测人脸,那么需要使用OpenCV 提供的xml文件(级联表)在haarcascades目录下。
这张级联表有一个训练好的AdaBoost训练集。
首先要采用样本的Haar特征训练分类器,从而得到一个级联的AdaBoost分类器。
Haar特征值反映了图像的灰度变化情况。
例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。
当安装好后OpenCV3,有个/haarcascades文件夹,包含了所有OpenCV的人脸检测XML文件。
haarcascade_eye.xmlhaarcascade_eye_tree_eyeglasses.xmlhaarcascade_frontalcatface.xmlhaarcascade_frontalcatface_extended.xmlhaarcascade_frontalface_alt.xmlhaarcascade_frontalface_alt_tree.xmlhaarcascade_frontalface_alt2.xmlhaarcascade_frontalface_default.xmlhaarcascade_fullbody.xmlhaarcascade_lefteye_2splits.xmlhaarcascade_licence_plate_rus_16stages.xmlhaarcascade_lowerbody.xmlhaarcascade_profileface.xmlhaarcascade_righteye_2splits.xmlhaarcascade_russian_plate_number.xmlhaarcascade_smile.xmlhaarcascade_upperbody.xml上述xml分别是人脸不同的部位模型,我们使用如下模型来识别人脸haarcascade_frontalface_alt.xml本期分享一下如何使用此模型来识别图片中的人脸import cv2 # 导入img = cv2.imread(r'D:\foxtable\example\image\li.jpg') # 导入图片face = cv2.CascadeClassifier(r'D:\Program Files (x86)\Anaconda3\pkgs\libopencv-3.4.1-h875b8b8_3\Library\etc\haarcascades\haarcascade_frontalface_ alt.xml') # 导入人脸模型gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) # 灰度faces = face.detectMultiScale(gray)for (x, y, w, h) in faces: # 5个参数,一个参数图片,2 坐标原点,3 识别大小,4,颜色5,线宽cv2.rectangle(img, (x, y), (x w, y h), (0, 255, 0), 2)dWindow('powers') # 创建窗口cv2.imshow('powers_li', img) # 显示图片cv2.waitKey(0) # 暂停窗口cv2.destroyWindow() # 关闭窗口# 关闭窗口cv2.destroyAllWindows()使用OpenCV的自带的模型库检测人脸很容易实现,下期我们分享一下如何从视频中检测到人脸。
OpenCV人脸识别LBPH算法源码分析
OpenCV⼈脸识别LBPH算法源码分析1 背景及理论基础⼈脸识别是指将⼀个需要识别的⼈脸和⼈脸库中的某个⼈脸对应起来(类似于指纹识别),⽬的是完成识别功能,该术语需要和⼈脸检测进⾏区分,⼈脸检测是在⼀张图⽚中把⼈脸定位出来,完成的是搜寻的功能。
从OpenCV2.4开始,加⼊了新的类FaceRecognizer,该类⽤于⼈脸识别,使⽤它可以⽅便地进⾏相关识别实验。
原始的LBP算⼦定义为在3*3的窗⼝内,以窗⼝中⼼像素为阈值,将相邻的8个像素的灰度值与其进⾏⽐较,若周围像素值⼤于或等于中⼼像素值,则该像素点的位置被标记为1,否则为0。
这样,3*3邻域内的8个点经⽐较可产⽣8位⼆进制数(通常转换为⼗进制数即LBP码,共256种),即得到该窗⼝中⼼像素点的LBP值,并⽤这个值来反映该区域的纹理特征。
如下图所⽰:原始的LBP提出后,研究⼈员不断对其提出了各种改进和优化。
1.1 圆形LBP算⼦基本的 LBP算⼦的最⼤缺陷在于它只覆盖了⼀个固定半径范围内的⼩区域,这显然不能满⾜不同尺⼨和频率纹理的需要。
为了适应不同尺度的纹理特征,Ojala等对LBP算⼦进⾏了改进,将3×3邻域扩展到任意邻域,并⽤圆形邻域代替了正⽅形邻域,改进后的LBP算⼦允许在半径为R的圆形邻域内有任意多个像素点,从⽽得到了诸如半径为R的圆形区域内含有P个采样点的LBP算⼦,OpenCV中正是使⽤圆形LBP算⼦,下图⽰意了圆形LBP算⼦:1.2 旋转不变模式从LBP的定义可以看出,LBP算⼦是灰度不变的,但却不是旋转不变的,图像的旋转就会得到不同的LBP值。
Maenpaa等⼈⼜将LBP算⼦进⾏了扩展,提出了具有旋转不变性的LBP算⼦,即不断旋转圆形邻域得到⼀系列初始定义的LBP值,取其最⼩值作为该邻域的LBP值。
下图给出了求取旋转不变LBP的过程⽰意图,图中算⼦下⽅的数字表⽰该算⼦对应的LBP值,图中所⽰的8种LBP模式,经过旋转不变的处理,最终得到的具有旋转不变性的LBP值为15。
基于opencv人脸识别实验原理及过程
基于opencv人脸识别实验原理及过程1.引言1.1 概述概述:人脸识别技术是近年来快速发展的一种生物特征识别技术,其通过对人脸进行检测、识别和验证,实现对特定人员身份的自动识别。
随着计算机视觉和模式识别领域的不断进步,基于OpenCV的人脸识别成为应用最广泛的方法之一。
OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理函数和算法,使得人脸识别的实现变得简单而高效。
本文将介绍基于OpenCV的人脸识别的原理和实验过程。
首先,我们将探讨人脸识别的基本概念和原理,包括人脸检测、特征提取和人脸匹配等关键步骤。
然后,我们将详细介绍使用OpenCV实现人脸识别的具体过程,包括图像预处理、人脸检测与标定、特征提取和匹配算法的选择与实现等。
最后,我们将对实验结果进行总结和展望,探讨人脸识别技术的应用前景和挑战。
通过阅读本文,读者将能够了解人脸识别技术的基本原理和OpenCV 库的使用方法,掌握基于OpenCV的人脸识别实验的步骤和流程。
本文将为相关研究人员提供一个基础理论和实践指南,也为开发人员在实际应用中实现人脸识别功能提供了有益的参考。
文章结构是指文章的组织和布局方式,可以帮助读者更好地理解文章的内容和思路。
本篇文章的结构如下:1. 引言1.1 概述1.2 文章结构1.3 目的2. 正文2.1 基于OpenCV的人脸识别原理2.2 实验过程3. 结论3.1 总结3.2 展望在文章结构部分,我们会简要介绍文章的整体结构,以让读者了解文章的组成部分和顺序安排。
通过清晰的文章结构,读者可以更好地理解文章的逻辑和关联,提高阅读体验。
文章1.3 目的部分的内容可以如下所述:在本文中,我们的主要目的是介绍并解析基于opencv的人脸识别实验的原理及其过程。
通过这篇文章,我们希望读者能够了解人脸识别技术的基本概念、opencv库的使用以及实验的具体实施过程。
具体来说,我们的目的包括以下几个方面:1. 提供基于opencv的人脸识别原理的详细介绍:我们将解析人脸识别的基本原理,包括面部特征提取、特征比对等关键步骤,并给出相应的opencv实现方法。
Python基于Opencv来快速实现人脸识别过程详解(完整版)
Python基于Opencv来快速实现⼈脸识别过程详解(完整版)前⾔随着⼈⼯智能的⽇益⽕热,计算机视觉领域发展迅速,尤其在⼈脸识别或物体检测⽅向更为⼴泛,今天就为⼤家带来最基础的⼈脸识别基础,从⼀个个函数开始⾛进这个奥妙的世界。
⾸先看⼀下本实验需要的数据集,为了简便我们只进⾏两个⼈的识别,选取了beyond乐队的主唱黄家驹和贝斯⼿黄家强,这哥俩长得有⼏分神似,这也是对⼈脸识别的⼀个考验:两个⽂件夹,⼀个为训练数据集,⼀个为测试数据集,训练数据集中有两个⽂件夹0和1,之前看⼀些资料有说这⾥要遵循“slabel”命名规则,但后⾯处理起来⽐较⿇烦,因为⽬前opencv接受的⼈脸识别标签为整数,那我们就直接⽤整数命名吧:为了⽅便,我们每个⼈⽤20张照⽚来训练,0代表黄家驹,1代表黄家强:开始啦:1.检测⼈脸这应该是最基本的,给我们⼀张图⽚,我们要先检测出⼈脸的区域,然后才能进⾏操作,opencv已经内置了很多分类检测器,我们这次⽤haar:def detect_face(img):#将测试图像转换为灰度图像,因为opencv⼈脸检测器需要灰度图像gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#加载OpenCV⼈脸检测分类器Haarface_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')#检测多尺度图像,返回值是⼀张脸部区域信息的列表(x,y,宽,⾼)faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)# 如果未检测到⾯部,则返回原始图像if (len(faces) == 0):return None, None#⽬前假设只有⼀张脸,xy为左上⾓坐标,wh为矩形的宽⾼(x, y, w, h) = faces[0]#返回图像的正⾯部分return gray[y:y + w, x:x + h], faces[0]2.有了数据集和检测⼈脸的功能后,我们就可以进⾏预训练了最后返回所有训练图⽚的⼈脸检测信息和标签:# 该函数将读取所有的训练图像,从每个图像检测⼈脸并将返回两个相同⼤⼩的列表,分别为脸部信息和标签def prepare_training_data(data_folder_path):# 获取数据⽂件夹中的⽬录(每个主题的⼀个⽬录)dirs = os.listdir(data_folder_path)# 两个列表分别保存所有的脸部和标签faces = []labels = []# 浏览每个⽬录并访问其中的图像for dir_name in dirs:# dir_name(str类型)即标签label = int(dir_name)# 建⽴包含当前主题主题图像的⽬录路径subject_dir_path = data_folder_path + "/" + dir_name# 获取给定主题⽬录内的图像名称subject_images_names = os.listdir(subject_dir_path)# 浏览每张图⽚并检测脸部,然后将脸部信息添加到脸部列表faces[]for image_name in subject_images_names:# 建⽴图像路径image_path = subject_dir_path + "/" + image_name# 读取图像image = cv2.imread(image_path)# 显⽰图像0.1scv2.imshow("Training on image...", image)cv2.waitKey(100)# 检测脸部face, rect = detect_face(image)# 我们忽略未检测到的脸部if face is not None:#将脸添加到脸部列表并添加相应的标签faces.append(face)labels.append(label)cv2.waitKey(1)cv2.destroyAllWindows()#最终返回值为⼈脸和标签列表return faces, labels3.有了脸部信息和对应标签后,我们就可以使⽤opencv⾃带的识别器来进⾏训练了:#调⽤prepare_training_data()函数faces, labels = prepare_training_data("training_data")#创建LBPH识别器并开始训练,当然也可以选择Eigen或者Fisher识别器face_recognizer = cv2.face.LBPHFaceRecognizer_create()face_recognizer.train(faces, np.array(labels))4.训练完毕后就可以进⾏预测了在这之前我们可以设定⼀下预测的格式,包括⽤矩形框框出⼈脸并标出其名字,当然最后别忘了建⽴标签与真实姓名直接的映射表:#根据给定的(x,y)坐标和宽度⾼度在图像上绘制矩形def draw_rectangle(img, rect):(x, y, w, h) = rectcv2.rectangle(img, (x, y), (x + w, y + h), (128, 128, 0), 2)# 根据给定的(x,y)坐标标识出⼈名def draw_text(img, text, x, y):cv2.putText(img, text, (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 0), 2)#建⽴标签与⼈名的映射列表(标签只能为整数)subjects = ["jiaju", "jiaqiang"]5.现在就可以定义我们的预测函数了:# 此函数识别传递的图像中的⼈物并在检测到的脸部周围绘制⼀个矩形及其名称def predict(test_img):#⽣成图像的副本,这样就能保留原始图像img = test_img.copy()#检测⼈脸face, rect = detect_face(img)#预测⼈脸label = face_recognizer.predict(face)# 获取由⼈脸识别器返回的相应标签的名称label_text = subjects[label[0]]# 在检测到的脸部周围画⼀个矩形draw_rectangle(img, rect)# 标出预测的名字draw_text(img, label_text, rect[0], rect[1] - 5)#返回预测的图像return img6.最后使⽤我们test_data中的图⽚进⾏预测并显⽰最终效果:#加载测试图像test_img1 = cv2.imread("test_data/test1.jpg")test_img2 = cv2.imread("test_data/test2.jpg")#执⾏预测predicted_img1 = predict(test_img1)predicted_img2 = predict(test_img2)#显⽰两个图像cv2.imshow(subjects[0], predicted_img1)cv2.imshow(subjects[1], predicted_img2)cv2.waitKey(0)cv2.destroyAllWindows()来看看识别的结果:这就是⼈脸识别最基本的流程,后续还会进⼀步的研究,下⼀篇我们将讨论本次实验的⼀些细节和注意事项,算是对本篇的⼀次挖掘和总结吧。
Python+OpenCV人脸检测原理及示例详解
Python+OpenCV⼈脸检测原理及⽰例详解关于opencvOpenCV 是 Intel 开源计算机视觉库 (Computer Version) 。
它由⼀系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉⽅⾯的很多通⽤算法。
OpenCV 拥有包括 300 多个 C 函数的跨平台的中、⾼层 API 。
它不依赖于其它的外部库 —— 尽管也可以使⽤某些外部库。
OpenCV 对⾮商业应⽤和商业应⽤都是免费的。
同时 OpenCV 提供了对硬件的访问,可以直接访问摄像头,并且 opencv 还提供了⼀个简单的 GUI(graphics user interface) 系统 :highgui 。
我们就通过 OpenCV 提供的⼀些⽅法来构造出这个⼈脸检测(face detection)程序来。
opencv的python包装OpenCV 本⾝是有 C/C++ 编写的,如果要在其他语⾔中使⽤,我们可以通过对其动态链接库⽂件进⾏包装即可,幸运的是,Python 下有很多个这样的包装,本⽂中使⽤的是 Cvtypes 。
事实上,在 Python 中很多的包都是来⾃第三⽅的,⽐如 PIL(Python Image Library) 即为 C 语⾔实现的⼀个图形处理包,被包装到了 Python 中,这些包装可以让你像使⽤ Python 的内建函数⼀样的使⽤这些 API 。
⼈脸检测原理⼈脸检测属于⽬标检测(object detection) 的⼀部分,主要涉及两个⽅⾯1.先对要检测的⽬标对象进⾏概率统计,从⽽知道待检测对象的⼀些特征,建⽴起⽬标检测模型。
2.⽤得到的模型来匹配输⼊的图像,如果有匹配则输出匹配的区域,否则什么也不做。
计算机视觉计算机的视觉系统,跟⼈的眼睛是⼤不相同的,但是其中也有类似之处。
⼈眼之能够看到物体,是通过物体上反射出来的光线刺激⼈眼的感光细胞,然后视觉神经在⼤脑中形成物体的像。
计算机通过摄像头看到的东西要简单的多,简单来说,就是⼀堆由数字组成的矩阵。
python中使用Opencv进行人脸识别
python中使⽤Opencv进⾏⼈脸识别上⼀节讲到⼈脸检测,现在讲⼀下⼈脸识别。
具体是通过程序采集图像并进⾏训练,并且基于这些训练的图像对⼈脸进⾏动态识别。
⼈脸识别前所需要的⼈脸库可以通过两种⽅式获得:1.⾃⼰从视频获取图像 2.从⼈脸数据库免费获得可⽤⼈脸图像,如ORL⼈脸库(包含40个⼈每⼈10张⼈脸,总共400张⼈脸),ORL⼈脸库中的每⼀张图像⼤⼩为92x112。
若要对这些样本进⾏⼈脸识别必须要在包含⼈脸的样本图像上进⾏⼈脸识别。
这⾥提供⾃⼰准备图像识别出⾃⼰的⽅法。
1.采集⼈脸信息:通过摄像头采集⼈脸信息,10张以上即可,把图像⼤⼩调整为92x112,保存在⼀个指定的⽂件夹,⽂件名后缀为.pngdef generator(data):'''打开摄像头,读取帧,检测该帧图像中的⼈脸,并进⾏剪切、缩放⽣成图⽚满⾜以下格式:1.灰度图,后缀为 .png2.图像⼤⼩相同params:data:指定⽣成的⼈脸数据的保存路径'''name=input('my name:')#如果路径存在则删除路径path=os.path.join(data,name)if os.path.isdir(path):shutil.rmtree(path)#创建⽂件夹os.mkdir(path)#创建⼀个级联分类器face_casecade=cv2.CascadeClassifier('../haarcascades/haarcascade_frontalface_default.xml')#打开摄像头camera=cv2.VideoCapture(0)dWindow('Dynamic')#计数count=1while(True):#读取⼀帧图像ret,frame=camera.read()if ret:#转换为灰度图gray_img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#⼈脸检测face=face_casecade.detectMultiScale(gray_img,1.3,5)for (x,y,w,h) in face:#在原图上绘制矩形cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)#调整图像⼤⼩new_frame=cv2.resize(frame[y:y+h,x:x+w],(92,112))#保存⼈脸cv2.imwrite('%s/%s.png'%(path,str(count)),new_frame)count+=1cv2.imshow('Dynamic',frame)#按下q键退出if cv2.waitKey(100) & 0xff==ord('q'):breakcamera.release()cv2.destroyAllWindows()该程序运⾏后会在指定的data路径下创建⼀个你输⼊的⼈名的⽂件夹⽤于存放采集到的图像,在这⾥我输⼊了wjy,结果如图2.⼈脸识别OpenCV有3中⼈脸识别⽅法,分别基于三个不同算法,分别为Eigenfaces,Fisherfaces和Local Binary Pattern Histogram这些⽅法都有类似的⼀个过程,即先对数据集进⾏训练,对图像或视频中的⼈脸进⾏分析,并且从两个⽅⾯确定:1.是否识别到对应的⽬标,2.识别到的⽬标的置信度,在实际中通过阈值进⾏筛选,置信度⾼于阈值的⼈脸将被丢弃这⾥介绍⼀下利⽤特征脸即Eigenfaces进⾏⼈脸识别算法,特征脸法本质上就是PCA降维,基本思路是先把图像灰度化,转化为单通道,再将它⾸位相接转换为列向量,假设图像的⼤⼩是20*20的,那么这个向量就是400维,但是维度太⾼算法复杂度也会升⾼,所以需要降维,再使⽤简单排序即可#载⼊图像读取ORL⼈脸数据库,准备训练数据def LoadImages(data):'''加载图⽚数据⽤于训练params:data:训练数据所在的⽬录,要求图⽚尺⼨⼀样ret:images:[m,height,width] m为样本数,height为⾼,width为宽names:名字的集合labels:标签'''images=[]names=[]labels=[]label=0#遍历所有⽂件夹for subdir in os.listdir(data):subpath=os.path.join(data,subdir)#print('path',subpath)#判断⽂件夹是否存在if os.path.isdir(subpath):#在每⼀个⽂件夹中存放着⼀个⼈的许多照⽚names.append(subdir)#遍历⽂件夹中的图⽚⽂件for filename in os.listdir(subpath):imgpath=os.path.join(subpath,filename)img=cv2.imread(imgpath,cv2.IMREAD_COLOR)gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#cv2.imshow('1',img)#cv2.waitKey(0)images.append(gray_img)labels.append(label)label+=1images=np.asarray(images)#names=np.asarray(names)labels=np.asarray(labels)return images,labels,names#检验训练结果def FaceRec(data):#加载训练的数据X,y,names=LoadImages(data)#print('x',X)model=cv2.face.EigenFaceRecognizer_create()model.train(X,y)#打开摄像头camera=cv2.VideoCapture(0)dWindow('Dynamic')#创建级联分类器face_casecade=cv2.CascadeClassifier('../haarcascades/haarcascade_frontalface_default.xml')while(True):#读取⼀帧图像#ret:图像是否读取成功#frame:该帧图像ret,frame=camera.read()#判断图像是否读取成功#print('ret',ret)if ret:#转换为灰度图gray_img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#利⽤级联分类器鉴别⼈脸faces=face_casecade.detectMultiScale(gray_img,1.3,5)#遍历每⼀帧图像,画出矩形for (x,y,w,h) in faces:frame=cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2) #蓝⾊roi_gray=gray_img[y:y+h,x:x+w]try:#将图像转换为宽92 ⾼112的图像#resize(原图像,⽬标⼤⼩,(插值⽅法)interpolation=,)roi_gray=cv2.resize(roi_gray,(92,112),interpolation=cv2.INTER_LINEAR)params=model.predict(roi_gray)print('Label:%s,confidence:%.2f'%(params[0],params[1]))'''putText:给照⽚添加⽂字putText(输⼊图像,'所需添加的⽂字',左上⾓的坐标,字体,字体⼤⼩,颜⾊,字体粗细)'''cv2.putText(frame,names[params[0]],(x,y-20),cv2.FONT_HERSHEY_SIMPLEX,1,255,2)except:continuecv2.imshow('Dynamic',frame)#按下q键退出if cv2.waitKey(100) & 0xff==ord('q'):breakcamera.release()cv2.destroyAllWindows()在程序中,我们⽤cv2.face.EigenFaceRecognizer_create()创建⼈脸识别的模型,通过图像数组和对应标签数组来训练模型,该函数有两个重要的参数,1.保留主成分的数⽬,2.指定的置信度阈值,为⼀个浮点型。
利用OpenCV实现人脸检测
图2
万方数据
……sGRAPHICS PROG胁啊……………-一…………………………………………………………………………““
(配置属性)I LiIll【er(链接器)I Input(输入)”,在右侧列表 框中选择“Additional Dependencies(附加依赖项)”,在其右侧 的文本框中输入“cxcore.1ib cv.1ib m1.1ib highgul.1ib eval,iX.1ib” 等需要的库。
CFaceDetectionView0;
DECLARE—DYNCREATE(CFaceDetectionView} ,/属性
public:
4,
CFaceDetectionDoc’GetDocument()const;
CvHaarCIassifierCascade‘cascade;//特征器分类
CvMemStorage‘storage;
SDI“nctude
…:
,
(6)单击“OK(确定)”按钮保存配置。 1.3对Visual C++2005项目进行设置
新建一个项目后,需要设置项目所需的链接库。选择
“Projoct(项目)I Properties(属性)”菜单项,弹出如图2所 示的对话框.在左侧的列表框中选择“Configuration Properties
Ipllmage。gray=cvCreatelmage{cvSize《img一>width。 itug->height),8,1}:
Iptlmage。small—img=cvCreatelmage(cvSize{cvRound 《img->width/scale),cvRound(img->heightJscale)),8,1):
(2)在左侧列表框中选择“Projects and Solutions(项目和 解决问题方案)I VC++Directories(VC++目录)”。
python利用Opencv实现人脸识别功能
python利⽤Opencv实现⼈脸识别功能本⽂实例为⼤家分享了python利⽤Opencv实现⼈脸识别功能的具体代码,供⼤家参考,具体内容如下⾸先:需要在在⾃⼰本地安装opencv具体步骤可以问度娘如果从事于开发中的话建议⽤第三⽅的⼈脸识别(推荐阿⾥)1、视频流中进⾏⼈脸识别# -*- coding: utf-8 -*-import cv2import sysfrom PIL import Imagedef CatchUsbVideo(window_name, camera_idx):dWindow(window_name)# 视频来源,可以来⾃⼀段已存好的视频,也可以直接来⾃USB摄像头cap = cv2.VideoCapture(camera_idx)# 告诉OpenCV使⽤⼈脸识别分类器classfier = cv2.CascadeClassifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml")# 识别出⼈脸后要画的边框的颜⾊,RGB格式color = (0, 255, 0)count=0while cap.isOpened():ok, frame = cap.read() # 读取⼀帧数据if not ok:break# 将当前帧转换成灰度图像grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# ⼈脸检测,1.2和2分别为图⽚缩放⽐例和需要检测的有效点数faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))if len(faceRects) > 0: # ⼤于0则检测到⼈脸count=count+1return countif __name__ == '__main__':result=CatchUsbVideo("识别⼈脸区域", '2222.mp4')if result>0:print('视频中有⼈!!')else:print('视频中⽆⼈!!')2、通过图⽚识别⼈脸#-*-coding:utf8-*-#import osimport cv2from PIL import Image,ImageDrawfrom datetime import datetimeimport time#detectFaces()返回图像中所有⼈脸的矩形坐标(矩形左上、右下顶点)#使⽤haar特征的级联分类器haarcascade_frontalface_default.xml,在haarcascades⽬录下还有其他的训练好的xml⽂件可供选择。
使用OpenCV内置深度学习人脸模块,几行代码轻松完成人脸检测和识别
使⽤OpenCV内置深度学习⼈脸模块,⼏⾏代码轻松完成⼈脸检测和识别作者:冯远滔(OpenCV China),王成瑞(北京邮电⼤学),钟瑶瑶(北京邮电⼤学)最新发布的OpenCV 4.5.4版本收录了⼀个基于深度学习神经⽹络的⼈脸模块(以下称“OpenCV DNN Face”),包括⼈脸检测(使⽤模型YuNet,由OpenCV China团队贡献)和⼈脸识别(使⽤模型SFace,由北京邮电⼤学邓伟洪教授课题组贡献)。
使⽤OpenCV DNN Face的API,只需⼏⾏代码便可以完成整个⼈脸检测和⼈脸识别处理,极⼤的⽅便了开发。
# ⼈脸检测img = cv.imread('path/to/image')faceDetector = cv.FaceDetectorYN.create('/path/to/model', '', img.shape[:2])faces = faceDetector.detect(image)# ⼈脸识别recognizer = cv.FaceRecognizerSF.create(recog_model_path, '' )aligned_face = recognizer.alignCrop(img, faces[1][0])feature = recognizer.feature(aligned_face)cosine_score = recognizer.match(feature1, feature2, 0)在相应的数据集上对OpenCV DNN Face的两个模型分别进⾏测试:⼈脸检测模型YuNet在WIDER Face数据集的验证集中达到了0.856(AP_easy),0.842(AP_medium),0.727(AP_hard);⼈脸识别模型SFace在LFW数据集上达到了99.60%的准确率(https:///master/d0/dd4/tutorial_dnn_face.html中有更详细的测试结果,以及此⼈脸模块的⼀些使⽤说明)。
基于OpenCv的人脸识别系统设计与实现代码大全
基于OpenCv的人脸识别系统设计与实现1.1 题目的主要研究内容(宋体四号加粗左对齐)(1)工作的主要描述:本文设计了基于 OpenCV 库的人脸识别系统,采用Haar 人脸特征,详细描述了人脸识别设计实现的方式,并设计所对应阶段的逻辑框架,最后结合逻辑框架运用 Python 语言编写并验证本文设计的人脸识别系统。
通过多次训练验证并实现人脸识别及判别功能。
(2)系统流程图:1.2 题目研究的工作基础或实验条件(1)硬件环境笔记本电脑,处理器:R7 5800H(2)软件环境开发语言:Python开发工具:PyCharm20211.3 数据集描述一个程序能识别给定图像或视频中的人脸。
实现这一目标的方法之一是用一系列分类好的图像来“训练”数据,并基于这些图像来进行识别。
获取数据:可以通过网上搜索图片或者自己录入(我们选择的是从网上下载某些人的图片来训练数据)有了数据,需要将这些样本图像加载到人脸识别算法中。
所有的人脸识别算法在它们的train()函数中都有两个参数:图像数组和标签数组。
这些标签表示进行识别时候某人人脸的ID,因此根据ID可以知道被识别的人是谁。
要做的这一点需要生成一个.yml文件。
1.4 人脸特征提取过程描述特征提取是人脸识别的关键问题之一。
本设计中主要采用的是Harr特征提取方法。
摄影作品可能包含很多令人愉悦的细节。
但是,由于灯光、视角、视距、摄像头抖动以及数字噪声的变化,图像细节变得不稳定。
人们在分类时不会受这些物理细节方面差异的影响。
提取出图像的细节对产生稳定分类结果和跟踪结果很有用处。
这些提取的结果被称为特征,专业的表述为:从图像数据中提取特征。
Haar特征是一种用于实现实时人脸跟踪的特征。
每一个Haar特征都描述了相邻图像区域的对比模式。
1.5 人脸识别过程描述人脸识别采用的是LBPH算法,LBPH(Local Binary Pattern Histogram)将检测到的人脸分为小单元,并将其与模型中的对应单元进行比较,对每个区域的匹配值产生一个直方图。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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下载中搜索这两个文件。
第三步:有了源程序,并且配置好了就可以直接进行运行了,注意:本程序是直接打开摄像头,可以同时检测摄像头前的多个人脸和人眼睛,人脸检测结果效果非常好。
下图是检测结果,
侧面检测人脸
正面检测人脸
检测到眼睛和人脸(即使有遮挡也可以检测)。