我一直在寻找自己编写Haar Cascaded人脸检测的实现已经有一段时间了,并且已经开始潜入OpenCV 2.0实现。
开箱即用,在调试模式下运行,Visual Studio在cvhaar.cpp:1518
上中断,通知我:
运行时检查失败#2 - 堆栈声音变量
seq_thread
已损坏。
对我来说,OpenCV附带一个简单的数组越界问题似乎很奇怪。运行发布没有任何问题,但我怀疑它只是没有执行检查,数组超出了界限。
为什么我收到此错误消息?这是OpenCV中的错误吗?
答案 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;
这有什么意义吗?