OpenCV Error: Assertion failed (dsize.area() || (inv_scale_x > 0 && inv_scale_y > 0)) in unknown fun

[RESOLVED] HOGDescriptor Error: Assertion Failed!
HOGDescriptor
assertion
error
asked Jun 13 '13
Shaban gravatar image
Shaban flag of Indonesia 
187 ●2 ●8 ●17
updated Jun 13 '13
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! :))
add a comment
1 answer Sort by » oldestnewestmost voted
1
answered Jun 13 '13
Siegfried gravatar image
Siegfried 
1333 ●8 ●25
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);
link 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 (Jun 13 '13)
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 (Jun 13 '13)
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 (Apr 10 '14)
add a comment
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值