OpenCV HOGDescriptor 错误

13

我正在Mac OS X 10.8上运行OpenCV 2.4.3。 我尝试使用cv::HOGDescriptor在视频序列中获取行人。

这是我用来检测并绘制边界框的代码。

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

然而,当执行到这一行 body.detectMultiScale(gray, rects); 时,我遇到了一个错误,整个应用程序崩溃了。

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

出了什么问题?我似乎无法从 gdblldb 的输出中获取到任何新的信息。我使用 CMake 构建编译代码,所以我猜这不是链接的问题。

以下是崩溃线程的堆栈跟踪 -

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
在Linux系统上,相同的代码会给我一个错误,错误信息是-
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
3个回答

7

我还没有找到这个错误为什么会发生的原因。不过它似乎与如何将XML HOG级联文件加载到内存中有关。

我已经在OpenCV问题跟踪器中报告了这个bug,并正在等待开发人员的回复。

暂时,我解决这个问题的方法是直接在cv::HOGDescriptor类中设置SVM参数,如下所示:

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

这似乎适用于OpenCV 2.4.3的Mac OSX和Linux版本。

4

我不是这个领域的专家,但我认为你因为大小不匹配问题而得到了断言失败错误。我建议使用一些预定义大小来初始化矩形,并查看是否仍然出现相同的错误。 希望这可以帮助到你。


-1

我有和你一样的问题:HOGDescriptor错误和断言失败

但试试这个!

更改你的...

cv::HOGDescriptor body;

到...

cv::CascadeClassifier body;

它的效果非常好!它可以检测到行人!:)

但是还有另一个问题,这个程序运行得很慢!太卡了!:))


嘿,查看此链接以获取有关HOGDescriptor的更多信息:http://docs.opencv.org/modules/gpu/doc/object_detection.html 我认为您需要更改所有代码以使用HOGDescriptor。 :) - Shabanzo
这甚至不是同一个算法。OP要求使用HOGDescriptor。 - Jean-François Côté

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接