2015-03-28 3 views
0

Вопросом фронтом

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


Подробности

У меня есть проект 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 только объявлен и не (пока) использовали anyw Вот. Комментируя это, «исправляет» эту проблему.

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

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

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

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

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(); 

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

Кредит: nikk от this post дал мне знать об этих функциях и сохранил мой бекон, большое время.