Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OpenCV HOGDescriptor Errors

I am running OpenCV 2.4.3 on Mac OS X 10.8. I am trying to use the cv::HOGDescriptor to get pedestrians in a video sequence.

This is the code I am using to do the detection and paint a bounding box.

  cv::VideoCapture input("file.avi");
  assert(input.isOpened());
  cv::HOGDescriptor body;
  assert(body.load("hogcascade_pedestrians.xml"));
  cv::Mat frame, gray;
  cv::namedWindow("video");

  while (input.read(frame)) {
    vector<cv::Rect> rects;
    cv::cvtColor(frame, gray, cv::COLOR_RGB2GRAY);
    cv::equalizeHist(gray, gray);

    body.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(255, 0, 255));
    }
    cv::imshow("video", frame);
  }

However, when the execution reaches the line body.detectMultiScale(gray, rects);, I get the an error and the whole application crashes

libc++abi.dylib: terminate called throwing an exception
[1]    92156 abort      ../bin/DetectPedestrians

What is going wrong? I cannot seem to get any new information from the gdb or lldb outputs. I am compiling with the code with a CMake build, so I guess this isn't a problem with the linking.

Here is a stack trace from the thread that crashed -

Thread 0 Crashed:: Dispatch queue: com.apple.root.default-priority
0   libsystem_kernel.dylib          0x00007fff8c001212 __pthread_kill + 10
1   libsystem_c.dylib               0x00007fff8e7afaf4 pthread_kill + 90
2   libsystem_c.dylib               0x00007fff8e7f3dce abort + 143
3   libc++abi.dylib                 0x00007fff94096a17 abort_message + 257
4   libc++abi.dylib                 0x00007fff940943c6 default_terminate() + 28
5   libobjc.A.dylib                 0x00007fff8e11f887 _objc_terminate() + 111
6   libc++.1.dylib                  0x00007fff96b0b8fe std::terminate() + 20
7   libobjc.A.dylib                 0x00007fff8e11f5de objc_terminate + 9
8   libdispatch.dylib               0x00007fff8c4ecfa0 _dispatch_client_callout2 + 28
9   libdispatch.dylib               0x00007fff8c4ed686 _dispatch_apply_serial + 28
10  libdispatch.dylib               0x00007fff8c4e80b6 _dispatch_client_callout + 8
11  libdispatch.dylib               0x00007fff8c4ebae8 _dispatch_sync_f_invoke + 39
12  libopencv_core.2.4.3.dylib      0x0000000101d5d900 cv::parallel_for_(cv::Range const&, cv::ParallelLoopBody const&, double) + 116
13  libopencv_objdetect.2.4.3.dylib 0x000000010257fa21 cv::HOGDescriptor::detectMultiScale(cv::Mat const&, std::vector<cv::Rect_<int>, std::allocator<cv::Rect_<int> > >&, std::vector<double, std::allocator<double> >&, double, cv::Size_<int>, cv::Size_<int>, double, double, bool) const + 559
14  libopencv_objdetect.2.4.3.dylib 0x000000010257fdc2 cv::HOGDescriptor::detectMultiScale(cv::Mat const&, std::vector<cv::Rect_<int>, std::allocator<cv::Rect_<int> > >&, double, cv::Size_<int>, cv::Size_<int>, double, double, bool) const + 80
15  DetectPedestrians               0x0000000101a7886c main + 2572 (detect.cpp:41)
16  libdyld.dylib                   0x00007fff8d89f7e1 start + 1

On a Linux system, the same code gives me an error saying -

OpenCV Error: Assertion failed (dsize.area() || (inv_scale_x > 0 && inv_scale_y > 0)) in resize, file /home/subho/OpenCV/OpenCV-2.4.3/modules/imgproc/src/imgwarp.cpp, line 1726
terminate called after throwing an instance of 'tbb::captured_exception'
  what():  /home/subho/OpenCV/OpenCV-2.4.3/modules/imgproc/src/imgwarp.cpp:1726: error: (-215) dsize.area() || (inv_scale_x > 0 && inv_scale_y > 0) in function resize
like image 795
ssb Avatar asked Jan 13 '13 17:01

ssb


2 Answers

I havent been able to track down why exactly this error occurs. However it has something to do with how the XML HOG cascade file is loaded into memory.

I have reported this as an bug in the OpenCV issue tracker and am waiting to hear back from the developers.

Temporarily, my workaround for this problem is to directly set the SVM parameters in the cv::HOGDescriptor class like so

cv::HOGDescriptor human;
human.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());

This seems to be working on both the Mac OSX and the linux versions of OpenCV 2.4.3

like image 107
ssb Avatar answered Oct 01 '22 17:10

ssb


i am not an expert on this area, but i think you get the assertion failed error cause of size missmatch problems. i would suggest initilizing rects with some predifined size and see if you get the same error. hope this helps

like image 40
Diamantatos Paraskevas Avatar answered Oct 01 '22 18:10

Diamantatos Paraskevas