cvHaarDetectObjects():“变量'seq_thread'周围的堆栈已损坏。”

时间:2010-03-29 10:04:16

标签: c++ visual-studio-2008 opencv

我一直在寻找自己编写Haar Cascaded人脸检测的实现已经有一段时间了,并且已经开始潜入OpenCV 2.0实现。

开箱即用,在调试模式下运行,Visual Studio在cvhaar.cpp:1518上中断,通知我:

  

运行时检查失败#2 - 堆栈声音变量seq_thread已损坏。

对我来说,OpenCV附带一个简单的数组越界问题似乎很奇怪。运行发布没有任何问题,但我怀疑它只是没有执行检查,数组超出了界限。

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

1 个答案:

答案 0 :(得分:0)

我相信有一点调试揭示了罪魁祸首。我“固定”了它,但这对我来说仍然很奇怪。

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_THREADS

#define CV_MAX_THREADS 1

因此,seq_thread的声明绝不允许超过1,但cvGetNumThreads()返回2(我认为这反映了我机器中的核心数)。

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

if (max_threads > CV_MAX_THREADS) max_threads = CV_MAX_THREADS;

这有什么意义吗?