基于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的人脸检测程序我的电脑上是用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 cascadesif (!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 streamcapture.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 framedetectAndDisplay(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 facesface_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 eyeseyes_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 gotimshow(window_name, frame);}第二步:将haarcascade_eye_tree_eyeglasses.xml和haarcascade_frontalface_alt.xml两个文件放置在当前工程目录下注意,这两个文件非常重要,少了两个文件程序无法正常运行,这两个文件是训练好的人脸数据。
人脸识别程序源代码
1 .利用OpenCV进行人脸检测人脸检测程序主要完成3部分功能,即加载分类器、加载待检测图象以及检测并标示。
本程序使用OpenCV中提供的"haarcascade_frontalface_alt.xml”文件存储的目标检测分类,用cvLoa d函数载入后,进行强制类型转换。
OpenCV中提供的用于检测图像中目标的函数是cvHaarDete ctObjects,该函数使用指针对某目标物体(如人脸)训练的级联分类器在图象中找到包含目标物体的矩形区域,并将这些区域作为一序列的矩形框返回。
分类器在使用后需要被显式释放,所用的函数为cvReleaseHaarClassifierCascade。
这些函数原型请参看有关OpenCV手册。
2 .程序实现1)新建一个VisualC++MFC项目,取名为“FaceDetection",选择应用程序类型为“单文档”。
将菜单中多余的项去掉,并添加一项“人脸检测”,其ID为"ID_FaceDetected”,并生成该菜单项的消息映射函数。
2)在“FaceDetectionView.h”头文件中添加以下灰底色部分程序代码:〃南京森林公安高等专科学校江林升//FaceDetectionView.h:CFaceDetectionView 类的接□#pragmaonce#include"cv.h"#include"highgui.h"classCFaceDetectionView:publicCView<protected:〃仅从序列口化创建CFaceDetectionView();DECLARE_DYNCREATE(CFaceDetectionView)精心整理public:CFaceDetectionDoc*GetDocument()const;CvHaarClassifierCascade*cascade;〃特征器分类CvMemStorage*storage;voiddetect_and_draw(IplImage*img);IplImage*src; 〃载入的图像3)在,小2。
基于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人脸识别C++实例代码
OpenCV⼈脸识别C++实例代码#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/core/core.hpp>#include <opencv2/objdetect/objdetect.hpp>using namespace cv;using namespace std;void detectAndDraw( Mat& img, CascadeClassifier& cascade,CascadeClassifier& nestedCascade,double scale, bool tryflip );int main(){//VideoCapture cap(0); //打开默认摄像头//if(!cap.isOpened())//{// return -1;//}Mat frame;Mat edges;CascadeClassifier cascade, nestedCascade;bool stop = false;//训练好的⽂件名称,放置在可执⾏⽂件同⽬录下cascade.load("D:\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");nestedCascade.load("D:\\opencv\\sources\\data\\haarcascades\\haarcascade_eye.xml");frame = imread("E:\\tmpimg\\hezhao.jpg");detectAndDraw( frame, cascade, nestedCascade,2,0 );waitKey();//while(!stop)//{// cap>>frame;// detectAndDraw( frame, cascade, nestedCascade,2,0 );// if(waitKey(30) >=0)// stop = true;//}return0;}void detectAndDraw( Mat& img, CascadeClassifier& cascade,CascadeClassifier& nestedCascade,double scale, bool tryflip ){int i = 0;double t = 0;//建⽴⽤于存放⼈脸的向量容器vector<Rect> faces, faces2;//定义⼀些颜⾊,⽤来标⽰不同的⼈脸const static Scalar colors[] = {CV_RGB(0,0,255),CV_RGB(0,128,255),CV_RGB(0,255,255),CV_RGB(0,255,0),CV_RGB(255,128,0),CV_RGB(255,255,0),CV_RGB(255,0,0),CV_RGB(255,0,255)} ;//建⽴缩⼩的图⽚,加快检测速度//nt cvRound (double value) 对⼀个double型的数进⾏四舍五⼊,并返回⼀个整型数!Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 );//转成灰度图像,Harr特征基于灰度图cvtColor( img, gray, CV_BGR2GRAY );imshow("灰度",gray);//改变图像⼤⼩,使⽤双线性差值resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );imshow("缩⼩尺⼨",smallImg);//变换后的图像进⾏直⽅图均值化处理equalizeHist( smallImg, smallImg );imshow("直⽅图均值处理",smallImg);//程序开始和结束插⼊此函数获取时间,经过计算求得算法执⾏时间t = (double)cvGetTickCount();//检测⼈脸//detectMultiScale函数中smallImg表⽰的是要检测的输⼊图像为smallImg,faces表⽰检测到的⼈脸⽬标序列,1.1表⽰//每次图像尺⼨减⼩的⽐例为1.1,2表⽰每⼀个⽬标⾄少要被检测到3次才算是真的⽬标(因为周围的像素和不同的窗⼝⼤//⼩都可以检测到⼈脸),CV_HAAR_SCALE_IMAGE表⽰不是缩放分类器来检测,⽽是缩放图像,Size(30, 30)为⽬标的//最⼩最⼤尺⼨cascade.detectMultiScale( smallImg, faces,1.1, 2, 0//|CV_HAAR_FIND_BIGGEST_OBJECT//|CV_HAAR_DO_ROUGH_SEARCH|CV_HAAR_SCALE_IMAGE,Size(30, 30));//如果使能,翻转图像继续检测if( tryflip ){flip(smallImg, smallImg, 1);imshow("反转图像",smallImg);cascade.detectMultiScale( smallImg, faces2,1.1, 2, 0//|CV_HAAR_FIND_BIGGEST_OBJECT//|CV_HAAR_DO_ROUGH_SEARCH|CV_HAAR_SCALE_IMAGE,Size(30, 30) );for( vector<Rect>::const_iterator r = faces2.begin(); r != faces2.end(); r++ ){faces.push_back(Rect(smallImg.cols - r->x - r->width, r->y, r->width, r->height));}}t = (double)cvGetTickCount() - t;// qDebug( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ ){Mat smallImgROI;vector<Rect> nestedObjects;Point center;Scalar color = colors[i%8];int radius;double aspect_ratio = (double)r->width/r->height;if( 0.75 < aspect_ratio && aspect_ratio < 1.3 ){//标⽰⼈脸时在缩⼩之前的图像上标⽰,所以这⾥根据缩放⽐例换算回去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);circle( img, center, radius, color, 3, 8, 0 );}elserectangle( img, cvPoint(cvRound(r->x*scale), cvRound(r->y*scale)),cvPoint(cvRound((r->x + r->width-1)*scale), cvRound((r->y + r->height-1)*scale)),color, 3, 8, 0);if( nestedCascade.empty() )continue;smallImgROI = smallImg(*r);//同样⽅法检测⼈眼nestedCascade.detectMultiScale( smallImgROI, nestedObjects,1.1, 2, 0//|CV_HAAR_FIND_BIGGEST_OBJECT//|CV_HAAR_DO_ROUGH_SEARCH//|CV_HAAR_DO_CANNY_PRUNING|CV_HAAR_SCALE_IMAGE,Size(30, 30) );for( vector<Rect>::const_iterator nr = nestedObjects.begin(); nr != nestedObjects.end(); nr++ ) {center.x = cvRound((r->x + nr->x + nr->width*0.5)*scale);center.y = cvRound((r->y + nr->y + nr->height*0.5)*scale);radius = cvRound((nr->width + nr->height)*0.25*scale);circle( img, center, radius, color, 3, 8, 0 );}}imshow( "识别结果", img );}opencv 连接器配置[debug]opencv_ml2413d.libopencv_calib3d2413d.libopencv_contrib2413d.libopencv_core2413d.libopencv_features2d2413d.lib opencv_flann2413d.libopencv_gpu2413d.libopencv_highgui2413d.libopencv_imgproc2413d.libopencv_legacy2413d.libopencv_objdetect2413d.lib opencv_ts2413d.libopencv_video2413d.libopencv_nonfree2413d.libopencv_ocl2413d.libopencv_photo2413d.libopencv_stitching2413d.lib opencv_superres2413d.lib opencv_videostab2413d.lib [release]opencv_ml2413.libopencv_calib3d2413.libopencv_contrib2413.libopencv_core2413.libopencv_features2d2413.lib opencv_flann2413.libopencv_gpu2413.libopencv_highgui2413.libopencv_imgproc2413.libopencv_legacy2413.libopencv_objdetect2413.libopencv_ts2413.libopencv_video2413.libopencv_nonfree2413.libopencv_ocl2413.libopencv_photo2413.libopencv_stitching2413.libopencv_superres2413.libopencv_videostab2413.lib// 根据你的版本批量替换2413版本号。
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语言来实现基于人脸识别技术的实验。
首先,我们需要准备训练数据集和测试数据集,并对数据集进行预处理和特征提取。
然后,我们可以选择合适的算法模型进行训练,并对测试数据集进行验证和评估。
七、实验结果与分析通过实验我们可以得到不同算法在人脸识别任务上的表现结果,并对比它们的准确率、召回率等指标。
通过分析实验结果,可以帮助我们选择最适合当前任务需求的人脸识别算法,并对其性能进行优化和改进。
八、应用与展望人脸识别技术在安防监控、人机交互、身份认证等领域有着广泛的应用前景。
未来随着技术的不断发展,人脸识别技术将会变得更加智能化和便捷化,为社会生活带来更多便利。
手把手教你如何用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的人脸识别代码
基于opencv的人脸识别代码OpenCV是一款用于计算机视觉和机器学习的开放源代码的库。
它包含了大量的图像处理和计算机视觉算法,如人脸识别、图片处理、物体检测和跟踪等。
在本文中,我们将教您如何使用OpenCV实现人脸识别。
安装OpenCV首先,您需要安装OpenCV库。
您可以从官方网站下载预编译好的OpenCV库并安装。
您还需要将OpenCV添加到系统的环境变量中。
在Python代码中,我们需要使用OpenCV库。
我们可以使用import cv2语句导入OpenCV库。
导入其他库除了OpenCV库之外,我们还需要导入以下Python库:NumPy:用于在Python中进行科学计算的库os:用于在Python中执行操作系统相关任务的库方法我们需要使用以下方法:1. opencv中预定义的CascadeClassifier类。
2. detectMultiScale() 方法,用于检测图像中的所有人脸。
步骤现在我们将根据以下步骤编写Python代码:1. 导入必要的库import cv2import numpy as npimport os2. 定义训练集和分类器face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')3. 定义图像路径img_path = 'test.jpg'4. 读取图像img = cv2.imread(img_path)5. 将图像转换成灰度图像,因为人脸识别需要在灰度图像上进行。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)7. 在图像上标记人脸for (x, y, w, h) in faces:cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 3)8. 显示图像完整代码最终的Python代码如下所示:结论通过本文,您已经了解了使用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进⾏⼈脸识别上⼀节讲到⼈脸检测,现在讲⼀下⼈脸识别。
具体是通过程序采集图像并进⾏训练,并且基于这些训练的图像对⼈脸进⾏动态识别。
⼈脸识别前所需要的⼈脸库可以通过两种⽅式获得: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.4+ C++ 人脸识别=
OpenCV 2.4+ C++ 人脸识别机器学习∙机器学习的目的是把数据转换成信息。
∙机器学习通过从数据里提取规则或模式来把数据转成信息。
人脸识别∙人脸识别通过级联分类器对特征的分级筛选来确定是否是人脸。
∙每个节点的正确识别率很高,但正确拒绝率很低。
∙任一节点判断没有人脸特征则结束运算,宣布不是人脸。
∙全部节点通过,则宣布是人脸。
工业上,常用人脸识别技术来识别物体。
对图片进行识别#include "opencv2/core/core.hpp"#include "opencv2/objdetect/objdetect.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>#include <stdio.h>using namespace std;using namespace cv;string face_cascade_name = "haarcascade_frontalface_alt.xml";CascadeClassifier face_cascade;string window_name = "人脸识别";void detectAndDisplay( Mat frame );int main( int argc, char** argv ){Mat image;image = imread( argv[1]);if( argc != 2|| !image.data ){printf("[error] 没有图片\n");return-1;}if( !face_cascade.load( face_cascade_name ) ){printf("[error] 无法加载级联分类器文件!\n");return-1;}detectAndDisplay(image);waitKey(0);}void detectAndDisplay( Mat frame ){std::vector<Rect> faces;Mat frame_gray;cvtColor( frame, frame_gray, CV_BGR2GRAY );equalizeHist( frame_gray, frame_gray );face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );for( int i = 0; i < faces.size(); i++ ){Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5);ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255), 4, 8, 0);}imshow( window_name, frame );}效果:CascadeClassifier类这个函数将在每张图片中被CascadeClassifier::detectMultiScale()自动调用。
python基于OpenCV的人脸识别系统
from training import training from datasets import datasets from delFile import del_file
def main(): facedict = {} cur_path = r'./dataset/' while True: print('*' * 31) print(''' opencv人脸识别 -------------输入1,人脸采集 输入2,人脸训练 输入3,人脸识别 输入d,删除数据 输入q,退出程序 ''') print('*' * 31) num = input("请输入您的操作选择: ") if num == '1': mydict = datasets() facedict.update(mydict) print(facedict) elif num == '2': training() elif num == '3': recognition(facedict) elif num == 'd': del_file(cur_path) elif num == 'q': print("退出程序成功!") break else: print("您输入有误,请重新输入!")
if __name__ == '__main__&好我按照您的方法跑通了objectdetection单机单卡但是在跑单机多卡一段时间后就会出现报错然后就停止了请问这个是什么原因导致的我该如何修改谢谢
python基于 OpenCV的人脸识别系统
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⽂件可供选择。
Python基于OpenCV库Adaboost实现人脸识别功能详解
Python基于OpenCV库Adaboost实现⼈脸识别功能详解本⽂实例讲述了Python基于OpenCV库Adaboost实现⼈脸识别功能。
分享给⼤家供⼤家参考,具体如下:以前⽤Matlab写神经⽹络的⾯部眼镜识别算法,研究算法逻辑,采集⼤量训练数据,迭代,计算各感知器的系数。
相当之⿇烦~⽽现在运⽤调⽤pythonOpenCV库Adaboost算法,⽆需知道算法逻辑,⽆需进⾏模型训练,⼈脸识别变得相当之简单了。
需要⽤到的库是opencv(open source computer vision),下载安装⽅式如下:使⽤pip install numpy语句安装numpy(如果出现错误:Microsoft Visual C++ 9.0 is required <unable to find vcvarsall.bat>,使⽤管理员⾝份安装Microsoft Visual C++ 9.0,重新启动计算机,再使⽤使⽤pip install numpy语句安装numpyopencv2.4.10下载之后解压(随便解压到哪⾥),将解压⽬录opencv⽂件夹中,build->python->2.7->x86下的⽂件cv2.pyd 复制到python2.7\Lib\site-packages 中测试是否安装成功,执⾏解压⽬录下的sources\samples\python\drawing.py或者进⼊python环境,使⽤import cv2⾸先讲讲需要⽤到的新函数:CascadeClassifier()函数,导⼊分类器cv2.CascadeClassifier('xxxxx.xml')#haarcascade_frontalface_alt.xml脸部识别⽂件#haarcascade_eye.xml眼部识别⽂件函数的参数是xml完整路径(具体看你的opencv安装在哪⾥的,在opencv\sources\data\haarcascades下⾯),xml⽂件中是封装好的算法detectMultiScale()函数,进⾏识别detectMultiScale(image,scaleFactor,minNeighbors,flags,minSize,maxSize)最终返回值为识别出的矩阵框[x, y, w, h],(x,y)左上⾓起始坐标,w宽,h⾼image:⽤于检测的图像scaleFactor:前后两次相继的扫描中,搜索窗⼝的⽐例系数.例如1.1指将搜索窗⼝依次扩⼤10%。
opencv 人脸识别 入门代码 python
以下是一个使用OpenCV库进行人脸识别的基本Python代码示例。
请确保已安装OpenCV库,你可以使用`pip`来安装:```bashpip install opencv-python```接下来,你可以使用以下代码来进行人脸识别:```pythonimport cv2# 加载人脸识别分类器face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades +'haarcascade_frontalface_default.xml')# 打开摄像头(0表示默认摄像头,如果有多个摄像头,可以更改为其他索引)cap = cv2.VideoCapture(0)while True:# 读取一帧视频ret, frame = cap.read()# 将帧转换为灰度图像(人脸识别通常在灰度图像上执行)gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 在灰度图像上检测人脸faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5, minSize=(30, 30))# 在图像上标记检测到的人脸for (x, y, w, h) in faces:cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)# 显示结果图像cv2.imshow('Face Detection', frame)# 检测按键,如果是'q'键则退出循环if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放摄像头并关闭窗口cap.release()cv2.destroyAllWindows()```这个示例使用了Haar级联分类器来检测人脸,并在摄像头捕获的图像上绘制绿色的矩形框来标记检测到的人脸。
opencv facerecognizersf 用法
opencv facerecognizersf 用法以下是使用OpenCV的FaceRecognizerSF的示例代码:cpp#include <opencv2/face.hpp>#include <opencv2/core.hpp>#include <opencv2/highgui.hpp>#include <opencv2/imgproc.hpp>#include <iostream>using namespace cv;using namespace cv::face;using namespace std;int main(int argc, char** argv){// 1. 加载人脸识别器Ptr<FaceRecognizer> model = FaceRecognizerSF::createLBPHFaceRecognizer();// 2. 加载人脸样本和标签vector<Mat> images;vector<int> labels;read_csv("face_data.csv", images, labels);// 3. 训练人脸识别器model->train(images, labels);// 4. 进行人脸识别Mat image = imread("test_face.jpg");Mat gray_image;cvtColor(image, gray_image, COLOR_BGR2GRAY);Mat embedding;model->predict(gray_image, embedding);// 5. 可视化识别结果cout << "Label: " << labels[0] << " Embedding: " << endl << embedding << endl;return 0;}请注意,上述代码中使用了read_csv函数来从CSV文件中加载人脸样本和标签。
基于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)。
#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分类器)来进行模式匹配。
cvHaarDetectObjects,先将图像灰度化,根据传入参数判断是否进行canny边缘处理(默认不使用),再进行匹配。
匹配后收集找出的匹配块,过滤噪声,计算相邻个数如果超过了规定值(传入的min_neighbors)就当成输出结果,否则删去。
匹配循环:将匹配分类器放大scale(传入值)倍,同时原图缩小scale倍,进行匹配,直到匹配分类器的大小大于原图,则返回匹配结果。
匹配的时候调用cvRunHaarClassifierCascade 来进行匹配,将所有结果存入CvSeq* Seq (可动态增长元素序列),将结果传给cvHaarDetectObjects。
cvRunHaarClassifierCascade函数整体是根据传入的图像和cascade来进行匹配。
并且可以根据传入的cascade类型不同(树型、stump(不完整的树)或其他的),进行不同的匹配方式。
函数cvRunHaarClassifierCascade 用于对单幅图片的检测。
在函数调用前首先利用cvSetImagesForHaarClassifierCascade设定积分图和合适的比例系数(=> 窗口尺寸)。
当分析的矩形框全部通过级联分类器每一层的时返回正值(这是一个候选目标),否则返回0或负值。
为了了解OpenCV人脸检测中寻找匹配图像的详细过程,就把cvHaarDetectObjects和cvRunHaarClassifierCascade的源文件详细看了一遍,并打上了注释。
方便大家阅读。
附cvHaarDetectObjects代码:CV_IMPL CvSeq*cvHaarDetectObjects( const CvArr* _img,CvHaarClassifierCascade* cascade,CvMemStorage* storage, double scale_factor,int min_neighbors, int flags, CvSize min_size ){int split_stage = 2;CvMat stub, *img = (CvMat*)_img;//CvMat多通道矩阵*img=_img指针代换传入图CvMat *temp = 0, *sum = 0, *tilted = 0, *sqsum = 0, *norm_img = 0, *sumcanny = 0, *img_small = 0;CvSeq* seq = 0;CvSeq* seq2 = 0;//CvSeq可动态增长元素序列CvSeq* idx_seq = 0;CvSeq* result_seq = 0;CvMemStorage* temp_storage = 0;CvAvgComp* comps = 0;int i;#ifdef _OPENMPCvSeq* seq_thread[CV_MAX_THREADS] = {0};int max_threads = 0;#endifCV_FUNCNAME( “cvHaarDetectObjects” );__BEGIN__;double factor;int npass = 2, coi;//npass=2int do_canny_pruning = flags & CV_HAAR_DO_CANNY_PRUNING;//true做canny边缘处理if( !CV_IS_HAAR_CLASSIFIER(cascade) )CV_ERROR( !cascade ? CV_StsNullPtr : CV_StsBadArg, “Invalid classifier cascade” );if( !storage )CV_ERROR( CV_StsNullPtr, “Null storage pointer” );CV_CALL( img = cvGetMat( img, &stub, &coi ));if( coi )CV_ERROR( CV_BadCOI, “COI is not supported”); //一些出错代码if( CV_MAT_DEPTH(img->type) != CV_8U )CV_ERROR( CV_StsUnsupportedFormat, “Only 8-bit images are supported” );CV_CALL( temp = cvCreateMat( img->rows, img->cols, CV_8UC1 ));CV_CALL( sum = cvCreateMat( img->rows + 1, img->cols + 1, CV_32SC1 ));CV_CALL( sqsum = cvCreateMat( img->rows + 1, img->cols + 1, CV_64FC1 ));CV_CALL( temp_storage = cvCreateChildMemStorage( storage ));#ifdef _OPENMPmax_threads = cvGetNumThreads();for( i = 0; i < max_threads; i++ ){CvMemStorage* temp_storage_thread;CV_CALL( temp_storage_thread = cvCreateMemStorage(0));//CV_CALL就是运行,假如出错就报错。