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 Тип прошел все свои строгие модульные и интеграционные тесты, поэтому в этом нет ничего принципиального.

1 ответ

Решение

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

initModule_<module name>();

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

initModule_features2d();

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

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

Другие вопросы по тегам