• 人脸检测


    其实,这些代码都是《学习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 "); fprintf(stderr, "Usage: facedetect --cascade="<cascade_path>" [filename|camera_index] "); return -1; } storage = cvCreateMemStorage(0); if (!input_name || (isdigit(input_name[0]) && input_name[1] == '')) 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] = ''; 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 ", 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 "); 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 ", 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); }
  • 相关阅读:
    【极角排序、扫描线】UVa 1606
    【计算几何】是时候知道这些函数了
    【技巧性(+递归运用)】UVa 1596
    【策略】UVa 11389
    【策略】UVa 1344
    夏季吃西瓜,会勤上厕所,会导致体内缺水,导致便秘,,会长豆豆
    Alt+Shift+R组合键,用来在一个java文件中批量的重命名变量。
    Pycharm-professional-2017.2.3破解安装
    通过反编译深入理解Java String及intern
    转:MyEclipse安装Eclipse Memory Analyzer插件,并进行错误文件分析流程
  • 原文地址:https://www.cnblogs.com/qiaozhoulin/p/4550378.html
Copyright © 2020-2023  润新知