0

I wanna ask how to detecting humans or pedestrians on blob (findcontours)? I've try to learn how to detecting any object on the frame using findcontours() like this:

#include"stdafx.h"
#include<vector>
#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>

int main(int argc, char *argv[])
{
    cv::Mat frame;                                              
    cv::Mat fg;     
    cv::Mat blurred;
    cv::Mat thresholded;
    cv::Mat thresholded2;
    cv::Mat result;
    cv::Mat bgmodel;                                            
    cv::namedWindow("Frame");   
    cv::namedWindow("Background Model"
        //,CV_WINDOW_NORMAL
        );
    //cv::resizeWindow("Background Model",400,300);
    cv::namedWindow("Blob"
        //,CV_WINDOW_NORMAL
        );
    //cv::resizeWindow("Blob",400,300);
    cv::VideoCapture cap("campus3.avi");    

    cv::BackgroundSubtractorMOG2 bgs;                           

        bgs.nmixtures = 3;
        bgs.history = 1000;
        bgs.varThresholdGen = 15;
        bgs.bShadowDetection = true;                            
        bgs.nShadowDetection = 0;                               
        bgs.fTau = 0.5;                                         

    std::vector<std::vector<cv::Point>> contours;               

    for(;;)
    {
        cap >> frame;                                           

        cv::GaussianBlur(frame,blurred,cv::Size(3,3),0,0,cv::BORDER_DEFAULT);

        bgs.operator()(blurred,fg);                         
        bgs.getBackgroundImage(bgmodel);                                

        cv::threshold(fg,thresholded,70.0f,255,CV_THRESH_BINARY);
        cv::threshold(fg,thresholded2,70.0f,255,CV_THRESH_BINARY);

        cv::Mat elementCLOSE(5,5,CV_8U,cv::Scalar(1));
        cv::morphologyEx(thresholded,thresholded,cv::MORPH_CLOSE,elementCLOSE);
        cv::morphologyEx(thresholded2,thresholded2,cv::MORPH_CLOSE,elementCLOSE);

        cv::findContours(thresholded,contours,CV_RETR_CCOMP,CV_CHAIN_APPROX_SIMPLE);
        cv::cvtColor(thresholded2,result,CV_GRAY2RGB);

        int cmin = 50; 
        int cmax = 1000;

        std::vector<std::vector<cv::Point>>::iterator itc=contours.begin();

        while (itc!=contours.end()) {   

                if (itc->size() > cmin && itc->size() < cmax){ 

                        std::vector<cv::Point> pts = *itc;
                        cv::Mat pointsMatrix = cv::Mat(pts);
                        cv::Scalar color( 0, 255, 0 );

                        cv::Rect r0= cv::boundingRect(pointsMatrix);
                        cv::rectangle(frame,r0,color,2);

                        ++itc;
                    }else{++itc;}
        }

        cv::imshow("Frame",frame);
        cv::imshow("Background Model",bgmodel);
        cv::imshow("Blob",result);
        if(cv::waitKey(30) >= 0) break;
    }
    return 0;
}

and now I wanna know how to detect humans? am I need to use hog? or haar? if yes I need to use them, how to use them? any tutorials to learn how to use it? because I'm so curious! and it's so much fun when I learn OpenCV! so addictive! :))

anyway I'll appreciate any help here, thanks. :)

Shabanzo
  • 87
  • 1
  • 3
  • 11
  • 1
    Yes, use HoG on every frame. Or try a [classifier](http://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html). – LovaBill Jun 11 '13 at 12:01
  • how to create xml classifier for head + upperbody + lowebody? there're are any tutorials about it? – Shabanzo Jun 12 '13 at 07:00
  • 1
    They are given. Check in OpenCV245/opencv/data/haarcascades. – LovaBill Jun 12 '13 at 07:10

1 Answers1

2

This is a good start, with lots of enthusiasm. There is more than one way to do human detection on images/image sequences. I summarize a few below:

  1. Since you are already extracting blobs that are supposed to be persons or objects, you can compare the features of these blobs with those of blobs resulting from a human in the scene. Many people look at the shape of the head-shoulder region, the height and area of the blob, etc.

  2. You can also look at research papers like this one. The earlier researches are easier to understand and code, compared to the recent papers.

  3. Instead of using background subtraction, you can also use an approach like Haar Wavelet based detection. This is widely used for face detection, but opencv contains a model for upper body detection. You can also build your own models, as described here.

Have fun!

Totoro
  • 3,398
  • 1
  • 24
  • 39
  • wow thanks! hmmm.. if I wanna use haar, so I don't need background substraction isn't it? how about HOG? but I think I wanna combine 2 methods for the robust detection, firstly I'll track the shape of the head-shoulder then I'll track the motion. I've the interesting one here http://stackoverflow.com/questions/5726575/head-and-shoulder-detection-using-opencv?rq=1 but I still need more information from research papers and some tutorials how to use haar and hog. >. – Shabanzo Jun 11 '13 at 05:02