代码之家  ›  专栏  ›  技术社区  ›  Paul Lammertsma

cvhaardetectObjects():“变量'seq_thread'的堆栈A已损坏。”

  •  0
  • Paul Lammertsma  · 技术社区  · 15 年前

    我已经开始编写自己的haar级联人脸检测实现了一段时间,并开始深入到opencv 2.0实现中。

    开箱即用,以调试模式运行,Visual Studio将打开 cvhaar.cpp:1518 ,通知我:

    运行时检查失败2-变量上的堆栈A seq_thread 已损坏。

    在我看来,OpenCV带有一个简单的数组越界问题似乎很奇怪。运行这个版本没有任何问题,但我怀疑它仅仅没有执行检查,而且数组超出了界限。

    为什么我收到此错误消息?这是OpenCV中的一个bug吗?

    1 回复  |  直到 15 年前
        1
  •  0
  •   Paul Lammertsma    15 年前

    我相信,一点调试就揭示了罪魁祸首。我“修复”了它,但这一切在我看来仍然很奇怪。

    大小数组 CV_MAX_THREADS 创建于 cvhaar.cpp:868 :

    CvSeq* seq_thread[CV_MAX_THREADS] = {0};
    

    在第918行,它继续说明 max_threads :

    max_threads = cvGetNumThreads();
    

    在不同的地方, seq_thread 循环使用以下 for 声明:

    for( i = 0; i < max_threads; i++ ) {
        CvSeq* s = seq_thread[i];
        // ...
    }
    

    然而, cxmisc.h:108 声明 cv_max_螺纹 :

    #define CV_MAX_THREADS 1
    

    因此,声明 顺序螺纹 决不能超过1号 cvGetNumThreads() 返回2(我假设这反映了我的机器中的核心数量)。

    我通过添加以下简单的小语句解决了这个问题:

    if (max_threads > CV_MAX_THREADS) max_threads = CV_MAX_THREADS;
    

    这有道理吗?