Небольшая отладка выявила виновника, я полагаю. Я «исправил» это, но мне все это кажется странным.
Массив размером 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;
Имеет ли что-нибудь из этого смысл?