Ask Your Question
0

[RESOLVED] HOGDescriptor Error: Assertion Failed!

asked 2013-06-12 22:46:17 -0600

Shaban gravatar image

updated 2013-06-13 04:11:45 -0600

Hi, I've just added HOG Descriptor to my object detection code to tracking the pedestrian. Here we go my code:

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

On my code, I minimize the area using findcontours and make the area bigger than the object using morphologyEX (Close) and then I'm using HOGDescriptors.detectMultiScale to detect human in the contours area. But I've got the error message when I run the program. This is my error message:

"OpenCV Error: Assertion failed (dsize.area() || (inv_scale_x > 0 && inv_scale_y > 0)) in unknown function, file C:\OpenCV\modules\imgproc\src\imgwarp.cpp, line 1726"

I've tried to detectMultiScale directly without findcontours but the same error message happened to me! So how to resolve this problems?

I'll appreciate any help here. Thanks! :)

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

edited: resolved!

I've changed...

cv::HOGDescriptor body;

to...

cv::CascadeClassifier body;

it works like a charm! it can detect the pedestrian! :)

but there's another problem, this program run slowly! SO LAGGY! :))

edit retag flag offensive close merge delete

1 answer

Sort by ยป oldest newest most voted
1

answered 2013-06-13 01:51:11 -0600

Siegfried gravatar image

Hi Shaban,

if you want to detect persons in ROI`s (given by each contour) you have to check that the ROI is larger than the used HoG detector size. cv::HOGDescriptor.detectMultiScale will crash if the ROI is smaller than the detector size. In your case you load a detector with height 96 and width 48. But you check if the number of the points of a contour is in a certain range (min = 50, max 1000).

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

To get the bounding rectangle of the ROI use the points of each contour.

cv::Rect object_bounding_box = cv::boundingRect(*itc);

Now, check if the height and width of the object_bounding_box is larger than the HoG detector.

if(object_bounding_box.height > human.winSize.height && object_bounding_box.width > human.winSize.width)

After the check you can take the ROI and run detectMultiScale on it.

cv::Mat object_roi = gray(object_bounding_box);
human.detectMultiScale(object_roi, rects);
edit flag offensive delete link more

Comments

Wow thanks! but I've got another error message on human.detectMultiscale(object_roi_ rects): "Error 1 error C2065: 'object_roi' : undeclared identifier C:\Users\MuhamadRizky\Documents\Visual Studio 2012\Projects\Shaban\Shaban\Shaban.cpp 82 1 Shaban" odd... T_T

Shaban gravatar imageShaban ( 2013-06-13 02:07:17 -0600 )edit

I've tried your suggestion but still got the same message. omg, I'm so curious about this case but til' now I can't resolve it.. T_T

Shaban gravatar imageShaban ( 2013-06-13 02:17:30 -0600 )edit

I've used your code but i'm having errors like IntelliSense: member "cv::BackgroundSubtractorMOG2::nmixtures" (declared at line 145 of "D:\drivers\opencv\build\include\opencv2/video/background_segm.hpp") is inaccessible c:\Users\Maryum\Documents\Visual Studio 2012\Projects\ObstacleDetection\ObstacleDetection\Task3ConsoleApp.cpp 30 13 ObstacleDetection... and to every variable like history and varThresholdGen and others..what would be the reason? Could you plz assist me?

Hejab gravatar imageHejab ( 2014-04-09 11:12:24 -0600 )edit

Question Tools

Stats

Asked: 2013-06-12 22:46:17 -0600

Seen: 4,665 times

Last updated: Dec 14 '13