cvHaarDetectObjects (): «Стек вокруг переменной seq_thread поврежден». - PullRequest
0 голосов
/ 29 марта 2010

Я уже некоторое время пытаюсь написать собственную реализацию каскадного распознавания лиц Хаара и начал с погружения в реализацию OpenCV 2.0.

Сразу после установки, работая в режиме отладки, Visual Studio останавливается на cvhaar.cpp:1518, сообщая мне:

Ошибка проверки времени выполнения # 2 - стек вокруг переменной seq_thread поврежден.

Мне кажется странным, что OpenCV поставляется с простой проблемой выхода за пределы массива. Запуск релиза работает без каких-либо проблем, но я подозреваю, что он просто не выполняет проверку и массив выходит за границы.

Почему я получаю это сообщение об ошибке? Это ошибка в OpenCV?

1 Ответ

0 голосов
/ 29 марта 2010

Небольшая отладка выявила виновника, я полагаю. Я «исправил» это, но мне все это кажется странным.

Массив размером 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;

Имеет ли что-нибудь из этого смысл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...