2013-06-13 49 views
1

我刚刚添加HOG描述符到我的对象检测代码来跟踪行人。在这里,我们去我的代码:HOGDescriptor错误和声明失败

#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> 
#include<opencv2/objdetect/objdetect.hpp> 

int main(int argc, char *argv[]) 
{ 
    cv::Mat frame;            
    cv::Mat fg;  
    cv::Mat blurred; 
    cv::Mat thresholded; 
    cv::Mat gray; 
    cv::Mat blob; 
    cv::Mat bgmodel;            
    cv::namedWindow("Frame"); 
    cv::namedWindow("Background Model"); 
    cv::namedWindow("Blob"); 
    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;    

    cv::HOGDescriptor human; 
    assert(human.load("hogcascade_pedestrians.xml")); 

    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::Mat elementCLOSE(5,5,CV_8U,cv::Scalar(255,255,255)); 
     cv::morphologyEx(thresholded,thresholded,cv::MORPH_CLOSE,elementCLOSE); 

     cv::findContours(thresholded,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE); 
     cv::cvtColor(thresholded,blob,CV_GRAY2RGB); 
     cv::drawContours(blob,contours,-1,cv::Scalar(1),CV_FILLED,8); 

     cv::cvtColor(frame,gray,CV_RGB2GRAY); 
     cv::equalizeHist(gray, gray); 

     int cmin = 50; 
     int cmax = 1000; 
     std::vector<cv::Rect> rects; 
     std::vector<std::vector<cv::Point>>::iterator itc=contours.begin(); 

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

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

         human.detectMultiScale(gray, rects); 
         for (unsigned int i=0;i<rects.size();i++) { 
          cv::rectangle(frame, cv::Point(rects[i].x, rects[i].y), 
          cv::Point(rects[i].x+rects[i].width, rects[i].y+rects[i].height), 
          cv::Scalar(0, 255, 0)); 
         } 

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

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

在我的代码,我使用findcontours减少面积,使面积比我使用HOGDescriptors.detectMultiScale检测人在使用morphologyEX(关闭),然后将对象大轮廓区域。但是当我运行程序时,我收到了错误信息。这是我的错误消息:

“OpenCV的错误:断言失败(dsize.area()||(inv_scale_x> 0 & & inv_scale_y> 0))中的功能未知,文件C:\的OpenCV \模块\ imgproc \ src \ imgwarp.cpp,line 1726“

我试图直接检测MultiScale而没有findcontours,但是同样的错误信息发生在我身上!那么如何解决这个问题呢?

我会很感激这里的任何帮助。谢谢! :)

==============

edited:解决!

我已经改变了......

cv::HOGDescriptor body; 

到...

cv::CascadeClassifier body; 

它就像一个魅力!它可以检测到行人! :)

但还有另一个问题,这个程序运行缓慢!很厉害! :))

+0

我解决这些问题的方法是查看已识别的文件/行,然后向后找出断言为何断开。 – Bull

+0

hmmm可能ROI小于使用的HOG检测器尺寸。但直到现在我无法解决它。 :/ – Shabanzo

回答

0

我解决了这个问题!

我已经改变了......

cv::HOGDescriptor body; 

到...

cv::CascadeClassifier body; 

,它就像一个魅力! :)

+1

谢谢!没有你的建议,我无法做到! :) – Shabanzo