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

Posted

技术标签:

【中文标题】cvHaarDetectObjects():“变量‘seq_thread’周围的堆栈已损坏。”【英文标题】:cvHaarDetectObjects(): "Stack aound the variable 'seq_thread' was corrupted." 【发布时间】:2010-03-29 10:04:15 【问题描述】:

一段时间以来,我一直在寻找自己的 Haar Cascaded 人脸检测实现,并开始着手研究 OpenCV 2.0 实现。

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

运行时检查失败 #2 - 变量 seq_thread 周围的堆栈已损坏。

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

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

【问题讨论】:

您能否更清楚地说明您的问题是什么? :-) 是的,对不起;经过审查,确实没有任何问题。我还添加了问题的可能来源。 我在 VS2008 中调试 OpenCV 的运气并不好。我通常会求助于构建安装包并以这种方式测试我的应用程序,或者至少制作一个 .exe 并将其放入包含必要 OpenCV .dll 文件的文件夹中。 【参考方案1】:

我相信,稍微调试一下就发现了罪魁祸首。我“修复”了它,但这一切对我来说仍然很奇怪。

cvhaar.cpp:868 上创建一个大小为CV_MAX_THREADS 的数组:

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;

这些有意义吗?

【讨论】:

以上是关于cvHaarDetectObjects():“变量‘seq_thread’周围的堆栈已损坏。”的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV cvHaarDetectObject 错误

随笔⑨ java中的变量 --- 类变量(静态变量),final变量,成员变量,局部变量

全局变量 静态变量 局部变量 啥时候创建 啥时候撤销

成员变量、实例变量和属性变量的区别

Java 局部变量实例变量类变量(静态变量)区别

成员变量实例变量局部变量类变量(静态变量)详解