#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/objdetect/objdetect.hpp" #include "opencv2/highgui/highgui.hpp" #include <stdio.h> #include <string.h> #include <ctype.h> #include <iostream> using namespace cv; using namespace std; // static void help() // { // printf( // "\nDemonstrate the use of the HoG descriptor using\n" // " HOGDescriptor::hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());\n" // "Usage:\n" // "./peopledetect (<image_filename> | <image_list>.txt)\n\n"); // } void main(void) { Mat img; const char *vedioFileName = "Walk1.mpg"; VideoCapture cap; cap.open(vedioFileName); if( !cap.isOpened() ) { std::cout<<"Vedio file "<<vedioFileName<<" open failed!"<<endl; return; } /************************************************************************/ /* CV_WRAP HOGDescriptor() : winSize(64,128), // detect window blockSize(16,16), // block 大小 blockStride(8,8), // overlap block的滑动步长 cellSize(8,8), // cell 大小 nbins(9), // 直方图的bin个数 derivAperture(1), // 微分算子核 winSigma(-1), // 在window上进行高斯加权 histogramNormType(HOGDescriptor::L2Hys), // 直方图归一化类型 L2HysThreshold(0.2), // L2-norm followed by clipping (limiting the maximum values of v to 0.2) and renormalising gammaCorrection(true), // Gamma校正,去除光照影响 nlevels(HOGDescriptor::DEFAULT_NLEVELS) // 分层数 */ /************************************************************************/ HOGDescriptor hog; hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); namedWindow("people detector", 1); for(;;) { cap>>img; if (!img.data) return; vector<Rect> found, found_filtered; double t = (double)getTickCount(); // run the detector with default parameters. to get a higher hit-rate // (and more false alarms, respectively), decrease the hitThreshold and // groupThreshold (set groupThreshold to 0 to turn off the grouping completely). hog.detectMultiScale(img, found, 0, Size(8,8), Size(32,32), 1.05, 2); t = (double)getTickCount() - t; printf("tdetection time = %gms\n", t*1000./cv::getTickFrequency()); size_t i, j; for( i = 0; i < found.size(); i++ ) { Rect r = found[i]; for( j = 0; j < found.size(); j++ ) if( j != i && (r & found[j]) == r) break; if( j == found.size() ) found_filtered.push_back(r); } for( i = 0; i < found_filtered.size(); i++ ) { Rect r = found_filtered[i]; // the HOG detector returns slightly larger rectangles than the real objects. // so we slightly shrink the rectangles to get a nicer output. r.x += cvRound(r.width*0.1); r.width = cvRound(r.width*0.8); r.y += cvRound(r.height*0.07); r.height = cvRound(r.height*0.8); rectangle(img, r.tl(), r.br(), cv::Scalar(0,255,0), 3); } imshow("people detector", img); int c = waitKey(1) & 255; if( c == 'q' || c == 'Q') break; } return; }
opencv行人检测代码
最新推荐文章于 2024-05-25 14:14:13 发布