• opencv+树莓PI的基于HOG特征的行人检测


    树莓PI远程控制摄像头请参考前文:http://www.cnblogs.com/yuliyang/p/3561209.html

    参考:http://answers.opencv.org/question/133/how-do-i-access-an-ip-camera/

    http://blog.youtueye.com/work/opencv-hog-peopledetector-trainning.html

    项目环境:opencv2.8  ,debian, QT

    代码:

    运行:

    yuliyang@debian-yuliyang:~/build-peopledetect-桌面-Debug$ ./peopledetect  /home/yuliyang/OLTbinaries/INRIAPerson/HOG/model_4BiSVMLight.alt

    model_4BiSVMLight.alt文件是INRIAPerson行人检测库HOG文件夹下的modle文件

    #include <fstream>
    #include <iostream>
    #include <vector>
    
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    
    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/objdetect/objdetect.hpp"
    #include "opencv2/highgui/highgui.hpp"
    
    using namespace std;
    using namespace cv;
    
    vector<float> load_lear_model(const char* model_file)
    {
         vector<float>  detector;
         FILE *modelfl;
         if ((modelfl = fopen (model_file, "rb")) == NULL)
         {
             cout<<"Unable to open the modelfile"<<endl;
             return detector;
         }
    
         char version_buffer[10];
         if (!fread (&version_buffer,sizeof(char),10,modelfl))
         {
             cout<<"Unable to read version"<<endl;
             return detector;
         }
    
         if(strcmp(version_buffer,"V6.01"))
         {
            cout<<"Version of model-file does not match version of svm_classify!"<<endl;
            return detector;
         }
         // read version number
         int version = 0;
         if (!fread (&version,sizeof(int),1,modelfl))
         {
             cout<<"Unable to read version number"<<endl;
             return detector;
         }
    
         if (version < 200)
         {
             cout<<"Does not support model file compiled for light version"<<endl;
             return detector;
          }
    
         long kernel_type;
         fread(&(kernel_type),sizeof(long),1,modelfl);
    
         {// ignore these
            long poly_degree;
            fread(&(poly_degree),sizeof(long),1,modelfl);
    
            double rbf_gamma;
            fread(&(rbf_gamma),sizeof(double),1,modelfl);
    
            double  coef_lin;
            fread(&(coef_lin),sizeof(double),1,modelfl);
            double coef_const;
            fread(&(coef_const),sizeof(double),1,modelfl);
    
            long l;
            fread(&l,sizeof(long),1,modelfl);
            char* custom = new char[l];
            fread(custom,sizeof(char),l,modelfl);
            delete[] custom;
        }
    
        long totwords;
        fread(&(totwords),sizeof(long),1,modelfl);
    
        {// ignore these
            long totdoc;
            fread(&(totdoc),sizeof(long),1,modelfl);
    
            long sv_num;
            fread(&(sv_num), sizeof(long),1,modelfl);
        }
    
        double linearbias = 0.0;
        fread(&linearbias, sizeof(double),1,modelfl);
    
        if(kernel_type == 0) { /* linear kernel */
            /* save linear wts also */
            double* linearwt = new double[totwords+1];
            int length = totwords;
            fread(linearwt, sizeof(double),totwords+1,modelfl);
    
            for(int i = 0;i<totwords;i++){
                float term = linearwt[i];
                detector.push_back(term);
            }
            float term = -linearbias;
            detector.push_back(term);
            delete [] linearwt;
    
        } else {
            cout<<"Only supports linear SVM model files"<<endl;
        }
    
        fclose(modelfl);
        return detector;
    
    }
    
    void help()
    {
        printf(
                "
    Demonstrate the use of the HoG descriptor using
    "
                "  HOGDescriptor::hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
    "
                "Usage:
    "
                "./peopledetect (<image_filename> | <image_list>.txt)
    
    ");
    }
    
    int main(int argc, char** argv)
    {
        VideoCapture cap;
        cap.open("http://192.168.1.102:8001/?action=stream?dummy=param.mjpg");//在浏览器里输入http://192.168.1.102:8001/?action=stream
        cap.set(CV_CAP_PROP_FRAME_WIDTH, 320);
        cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240);
        if (!cap.isOpened())
                return -1;
        Mat img;
        FILE* f = 0;
    //    char _filename[1024];
    
    //    if( argc != 3 )
    //    {
    //        cout<<"ERROR"<<endl;
    //        return 0;
    //    }
    //    img = imread(argv[1]);
    
    //    cap >> img;
    //    if( img.data )
    //    {
    //        strcpy(_filename, argv[1]);
    //    }
    //    else
    //    {
    //        f = fopen(argv[1], "rt");
    //        if(!f)
    //        {
    //            fprintf( stderr, "ERROR: the specified file could not be loaded
    ");
    //            return -1;
    //        }
    //    }
    
        HOGDescriptor hog;
        //hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
        vector<float> detector = load_lear_model(argv[1]);
        hog.setSVMDetector(detector);
        namedWindow("people detector", 1);
    
    
    
        while (true)
        {
            cap >> img;
            if (!img.data)
                continue;
    
            vector<Rect> found, found_filtered;
            hog.detectMultiScale(img, found, 0, Size(4,4), Size(0,0), 1.05, 2);
    
            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];
                r.x += cvRound(r.width*0.1);
            r.width = cvRound(r.width*0.8);
            r.y += cvRound(r.height*0.06);
            r.height = cvRound(r.height*0.9);
            rectangle(img, r.tl(), r.br(), cv::Scalar(0,255,0), 2);
        }
            imshow("people detector", img);
            if (waitKey(20) >= 0)
                break;
        }
    //    for(;;)
    //    {
    //        char* filename = _filename;
    //        if(f)
    //        {
    //            if(!fgets(filename, (int)sizeof(_filename)-2, f))
    //                break;
    //            //while(*filename && isspace(*filename))
    //            //  ++filename;
    //            if(filename[0] == '#')
    //                continue;
    //            int l = strlen(filename);
    //            while(l > 0 && isspace(filename[l-1]))
    //                --l;
    //            filename[l] = '';
    //            img = imread(filename);
    //        }
    //        printf("%s:
    ", filename);
    //        if(!img.data)
    //            continue;
    
    //        fflush(stdout);
    //        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
    ", 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(0) & 255;
    //        if( c == 'q' || c == 'Q' || !f)
    //            break;
    //    }
        if(f)
            fclose(f);
        return 0;
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    //#include "opencv2/imgproc/imgproc.hpp"
    //#include "opencv2/objdetect/objdetect.hpp"
    //#include "opencv2/highgui/highgui.hpp"
    
    //#include <stdio.h>
    //#include <string.h>
    //#include <ctype.h>
    
    //using namespace cv;
    //using namespace std;
    
    //void help()
    //{
    //    printf(
    //            "
    Demonstrate the use of the HoG descriptor using
    "
    //            "  HOGDescriptor::hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
    "
    //            "Usage:
    "
    //            "./peopledetect (<image_filename> | <image_list>.txt)
    
    ");
    //}
    
    //int main(int argc, char** argv)
    //{
    //    Mat img;
    //    FILE* f = 0;
    //    char _filename[1024];
    
    //    if( argc == 1 )
    //    {
    //        printf("Usage: peopledetect (<image_filename> | <image_list>.txt)
    ");
    //        return 0;
    //    }
    //    img = imread(argv[1]);
    
    //    if( img.data )
    //    {
    //        strcpy(_filename, argv[1]);
    //    }
    //    else
    //    {
    //        f = fopen(argv[1], "rt");
    //        if(!f)
    //        {
    //            fprintf( stderr, "ERROR: the specified file could not be loaded
    ");
    //            return -1;
    //        }
    //    }
    
    //    HOGDescriptor hog;
    //    hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
    //    namedWindow("people detector", 1);
    
    //    for(;;)
    //    {
    //        char* filename = _filename;
    //        if(f)
    //        {
    //            if(!fgets(filename, (int)sizeof(_filename)-2, f))
    //                break;
    //            //while(*filename && isspace(*filename))
    //            //	++filename;
    //            if(filename[0] == '#')
    //                continue;
    //            int l = strlen(filename);
    //            while(l > 0 && isspace(filename[l-1]))
    //                --l;
    //            filename[l] = '';
    //            img = imread(filename);
    //        }
    //        printf("%s:
    ", filename);
    //        if(!img.data)
    //            continue;
    
    //        fflush(stdout);
    //        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
    ", 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(0) & 255;
    //        if( c == 'q' || c == 'Q' || !f)
    //            break;
    //    }
    //    if(f)
    //        fclose(f);
    //    return 0;
    //}
    

     效果:

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    小结:ES7——async和await初识
    如何抽离、引用公共部分页面
    数据处理:高德、百度经纬度坐标的相互转化
    mock数据的基础使用
    express随笔
    ES6学习基础
    初学node.js
    ajax基础
    ajax的几个面试题
    (转)认识原型对象和原型链
  • 原文地址:https://www.cnblogs.com/yuliyang/p/3594002.html
Copyright © 2020-2023  润新知