您的位置:首页 > 大数据 > 人工智能

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

2017-10-18 16:21 4663 查看
[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
9049
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐