OpenCV: повреждение стека с неиспользуемой переменной

Почему простое включение SegmentedBounds вызывает повреждение стека? Он никогда не используется (пока), и я могу продолжить через программу после предупреждения о коррупции без каких-либо явных побочных эффектов.


У меня есть проект OpenCV 2.4.10 в Visual Studio 2013, который внезапно начал вызывать ошибку повреждения стека:

Run-Time Check Failure #2 - Stack around the variable 'was_processed' was corrupted!

Интересно, что это часть инфраструктуры OpenCV, а не мой код. Это терпит неудачу внутри sources/modules/highgui/src/window_w32.cpp в WindowProc() функция.

Я могу продолжать программу без видимых побочных эффектов.

Вот их код:

static LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
LRESULT ret;

if( hg_on_preprocess )
{
int was_processed = 0;
int rethg = hg_on_preprocess(hwnd, uMsg, wParam, lParam, &was_processed);
if( was_processed )
return rethg;
}
ret = HighGUIProc(hwnd, uMsg, wParam, lParam);

if(hg_on_postprocess)
{
int was_processed = 0;
int rethg = hg_on_postprocess(hwnd, uMsg, wParam, lParam, &was_processed);
if( was_processed )
return rethg;
}

return ret;
} // <================= Debugger says it stopped here

Вот мой код:

class ImageVariants {
public:
Mat getOriginal() const;
...

private:
Point3i Bounds3D;
SubjectFace Face;
Mat Mask;
Mat Original;
Bounds SegmentedBounds; // PROBLEMS
Bounds Subject;

bool boundsSet = false;
};

Что не получается:

Вот кикер, SegmentedBounds только объявлен и нигде (пока) не используется. Комментируя это «исправляет» эту проблему.

Кроме того, если переменная имеет тип Bounds* Там нет коррупции. Похоже, если след памяти ImageVariants превышает определенный размер, то мы получаем проблемы.

Это также произошло раньше, при тех же обстоятельствах, когда STL vector<> был объявлен и не используется в том же классе. Я просто удалил его, так как он мне не нужен.

Как это срабатывает:

Я использовал инструменты OpenGV HighGUI для взаимодействия с программой. Всякий раз, когда я получаю доступ к функции из ImageVariants класс, похоже на борк

Scalar color(255.0, 0.0, 0.0);
Point end(x, y);

//Draw the rectangle the user is drawing
Mat img = w->Segmenter.Variants.getOriginal();

rectangle(img, w->MouseStart, end, color, 1, 8, 0);
w->draw(&img);

getOriginal() просто возвращается Original от ImageVariants учебный класс. Он не получает доступ, не устанавливает и не использует SegmentedBounds в любом случае.

Что я знаю:

  • Я очень опытный разработчик C ++, поэтому такие вещи, как «вы не знаете, что делаете», просто неинициализированная переменная, цикл за пределами, вы копировали и вставляли код? и т.д. … не нужно применять. Этот код очень хорошо написан и понят.
  • Bounds тип, который вы видите связанным с переменной, на самом деле просто причудливая структура. Он очень тщательно используется многими способами по всей программе без каких-либо проблем.
  • Bounds Тип прошел все свои строгие модульные и интеграционные тесты, поэтому в этом нет ничего принципиального.

0

Решение

После двух недель борьбы я нашел ответ. По-видимому, некоторые функции некоторых модулей OpenCV требуют вызова функции для инициализации модуля перед его использованием:

initModule_<module name>();

Я не упомянул об этом в своем вопросе, но я использовал features2d Модуль в этом классе. В частности, я использовал KeyPoints объект из этой библиотеки. Итак, в конструкторе я добавил:

initModule_features2d();

Все мои проблемы ушли, никакой странности не понадобилось. Я не уверен, почему эти функции полностью недокументированы, поскольку я нигде не могу найти, что они даже делают, но они работают.

Кредит: ник из эта почта заставил меня осознать эти функции и спас мое сало, большое время.

0

Другие решения


По вопросам рекламы [email protected]