2013-06-11 7 views
0

블롭 (findcontours)에서 사람이나 보행자를 감지하는 방법을 묻고 싶습니다. 어떻게 이런 findcontours()를 사용하여 프레임에있는 객체의 검출에 배우려고했습니다인간 모양을 기반으로 인간이 findcontours를 사용하여 어떻게 탐지합니까?

#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; 
} 

을 지금은 인간을 감지하는 방법을 알고 싶어? 나는 돼지를 사용해야합니까? 또는 haar? 예, 사용하려면 어떻게 사용해야합니까? 어떤 자습서를 사용하는 방법을 배울 수 있습니까? 왜냐하면 나는 너무 궁금해서! OpenCV를 배울 때 너무 재미 있습니다! 그래서 중독성! :))

어쨌든 여기서 도움을 주시면 감사하겠습니다. :)

+1

예, 모든 프레임에서 호이 (HoG)를 사용하십시오. 또는 [분류 자] (http://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html)를 사용해보십시오. – William

+0

head + upperbody + lowebody에 대한 xml 분류 자 ​​생성 방법은 무엇입니까? 그것에 관한 튜토리얼이 있습니까? – Shabanzo

+1

그들은 주어진다. OpenCV245/opencv/data/haarcascades를 체크인하십시오. – William

답변

2

이것은 좋은 시작이며 많은 열정을 가지고 있습니다. 이미지/이미지 시퀀스에서 사람의 탐지를 수행하는 방법은 여러 가지가 있습니다. 나는 약간 아래에 요약 :

  1. 이미 사람이나 물체 있어야하는 모양을 추출하고 있기 때문에, 당신은 현장에서 인간으로 인한 얼룩의 사람들과 이러한 모양의 특징을 비교할 수 있습니다. 많은 사람들이 머리 - 어깨 부위의 모양, 얼룩의 높이 및 면적 등을 관찰합니다.

  2. this one과 같은 연구 논문을 볼 수도 있습니다. 초기 연구는 최근 논문과 비교하여 이해하기 쉽고 코드가 더 쉽습니다.

  3. 배경 빼기를 사용하는 대신 Haar Wavelet 기반 검색과 같은 방법을 사용할 수도 있습니다. 이것은 얼굴 탐지에 널리 사용되지만 opencv는 상체 탐지를위한 모델을 포함합니다. here과 같이 자신 만의 모델을 만들 수도 있습니다.

재미있게 보내십시오!

+0

와우 감사합니다! 흠 .. 만약 내가 haar를 사용하고 싶다면 배경 빼기가 필요하지 않은가? HOG는 어때? 하지만 나는 견고한 탐지를 위해 두 가지 방법을 결합하고 싶습니다. 먼저 머리 - 어깨의 모양을 추적 한 다음 동작을 추적 할 것입니다. 나는 여기 흥미로운 것을 가지고있다. http://stackoverflow.com/questions/5726575/head-and-shoulder-detection-using-opencv?rq=1 그러나 나는 연구 논문과 튜토리얼에서 더 많은 정보를 필요로한다. 돼지. >. < – Shabanzo