人脸检测

其实,这些代码都是《学习Opencv》这本书上的。


转自:http://www.cnblogs.com/ma6174/archive/2013/03/31/2991315.html
这个博客的Python代码是用CV写的,而我的是cv2,改过来之后有各种错误。
opencv写的这个有调用摄像头的部分,第一次运行的时候好像能行,但是之后就没结果了。
//
face_detection.cpp : 定义控制台应用程序的入口点。 // #define _CRT_SECURE_NO_WARNINGS #include "stdafx.h" #include "cv.h" #include "highgui.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <math.h> #include <float.h> #include <limits.h> #include <time.h> #include <ctype.h> #ifdef _EiC #define WIN32 #endif static CvMemStorage* storage = 0; static CvHaarClassifierCascade* cascade = 0; void detect_and_draw(IplImage* image); const char* cascade_name = "haarcascade_frontalface_alt.xml"; /* "haarcascade_profileface.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 = "haarcascade_frontalface_alt2.xml"; //opencv装好后haarcascade_frontalface_alt2.xml的路径, //也可以把这个文件拷到你的工程文件夹下然后不用写路径名cascade_name= "haarcascade_frontalface_alt2.xml"; //或者cascade_name ="C:\\Program Files\\OpenCV\\data\\haarcascades\\haarcascade_frontalface_alt2.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); if (!input_name || (isdigit(input_name[0]) && input_name[1] == '\0')) capture = cvCaptureFromCAM(!input_name ? 0 : input_name[0] - '0'); else capture = cvCaptureFromAVI(input_name); 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); else cvFlip(frame, frame_copy, 0); detect_and_draw(frame_copy); if (cvWaitKey(10) >= 0) break; } cvReleaseImage(&frame_copy); cvReleaseCapture(&capture); } else { //const char* filename = input_name ? input_name : (char*)"lena.jpg"; const char* filename = input_name ? input_name : (char*)"503.jpg"; IplImage* image = cvLoadImage(filename, 1); if (image) { detect_and_draw(image); cvWaitKey(0); cvReleaseImage(&image); } else { /* assume it is a text file containing the list of the image filenames to be processed - one per line */ 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); }
//这个代码亲测能运行,更改cvHaarDetectObjects的参数能够检测不同的人脸个数,转自:http://www.cnblogs.com/mengdd/archive/2012/08/01/2619043.html
#include"stdafx.h" #include "cv.h" #include "highgui.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <math.h> #include <float.h> #include <limits.h> #include <time.h> #include <ctype.h> #ifdef _EiC #define WIN32 #endif static CvMemStorage* storage = 0; static CvHaarClassifierCascade* cascade = 0; void detect_and_draw(IplImage* image); const char* cascade_name = "haarcascade_frontalface_alt.xml"; /* "haarcascade_profileface.xml";*/ int main(int argc, char** argv) { cascade_name = "haarcascade_frontalface_alt2.xml"; cascade = (CvHaarClassifierCascade*)cvLoad(cascade_name, 0, 0, 0); if (!cascade) { fprintf(stderr, "ERROR: Could not load classifier cascade\n"); return -1; } storage = cvCreateMemStorage(0); cvNamedWindow("result", 1); const char* filename = "96.jpg"; IplImage* image = cvLoadImage(filename, 1); if (image) { detect_and_draw(image); cvWaitKey(0); cvReleaseImage(&image); } cvDestroyWindow("result"); return 0; } void detect_and_draw(IplImage* img) { double scale = 1.2; 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 } } };//Just some pretty colors to draw with //Image Preparation // 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); cvCvtColor(img, gray, CV_BGR2GRAY); cvResize(gray, small_img, CV_INTER_LINEAR); cvEqualizeHist(small_img, small_img); //直方图均衡 //Detect objects if any // cvClearMemStorage(storage); double t = (double)cvGetTickCount(); CvSeq* objects = 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.)); //Loop through found objects and draw boxes around them for (int i = 0; i<(objects ? objects->total : 0); ++i) { CvRect* r = (CvRect*)cvGetSeqElem(objects, i); cvRectangle(img, cvPoint(r->x*scale, r->y*scale), cvPoint((r->x + r->width)*scale, (r->y + r->height)*scale), colors[i % 8]); } for (int i = 0; i < (objects ? objects->total : 0); i++) { CvRect* r = (CvRect*)cvGetSeqElem(objects, 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); }

 

posted @ 2015-06-03 21:57  linqiaozhou  阅读(435)  评论(0编辑  收藏  举报