2014-02-05 6 views
1

У меня есть проект на C++ с использованием Qt 5.1.1 и OpenCV 2.4.6. Алгоритм обработки изображений работает в отдельном потоке. Все работает нормально, но если я вызываю функцию OpenCV findContours(), программа вылетает с сообщением о переполнении стека (прямо в первый раз, когда эта функция вызывается, а не так, как она уже вызывалась несколько раз раньше) «Необработанное исключение в 0x56ec9a47 в SARA.exe : 0xC00000FD: переполнение стека. "OpenCV findContours Переполнение стека

Я нашел кого-то с same problem, но в его случае это был только вопрос об изменении проекта в Visual Studio 2010 ... но в моем случае, мой проект уже в VS2010.

Алгоритм работает отлично, если я создаю отдельный проект консоли, который просто вызывает алгоритм обработки изображений, но тот же код внутри потока в моем проекте Qt показывает переполнение стека! Если я удалю функцию findContours(), то все это произойдет. В обоих проектах я использую те же библиотеки libs и debug dll (versioned as xxx246d.dll), и я компилирую программу в качестве отладки.

Я попытался сделать стек больше, изменив Свойства -> Свойства конфигурации -> Linker -> Система -> Stack Reserve Size вариант, но тогда программа по-прежнему падает, с другим сообщением, говоря «необработанное исключение в 0x76e5c41f в SARA.exe: Microsoft C++ исключение: Параллельное :: scheduler_resource_allocation_error в ячейке памяти 0x14c7adc8 ..»

Я не думаю, что это проблема кода, так как он прекрасно работает в качестве консольного Aplication, но если кто-нибудь хочет видеть это:

QImage SaraVisualControl::findCircles(void) 

{ 
Mat imgInput = imread("M:/Desktop/PsEyeRight1.jpg", CV_LOAD_IMAGE_COLOR); 

Mat roiInput(imgInput, Rect(Point(205, 72), Point(419,285))); 
Mat imgContours = roiInput.clone(); 

cvtColor(imgContours, imgContours, CV_BGR2GRAY); 
GaussianBlur(imgContours, imgContours, Size(3, 3), 0, 0, 4);    
threshold(imgContours, imgContours, 150, 255, THRESH_BINARY); // Ou ler o Otsu uma vez e usar ele 

vector<vector<Point> > contours; 
vector<Vec4i> hierarchy;  

findContours(imgContours, contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_NONE, Point(0, 0)); // Program crashes here! 

vector<RotatedRect> ellipses; 
RotatedRect ellipse; 

for(int i = 0; i < contours.size(); i++) 
{ 
    if(contours[i].size() >= 5) 
    { 
     ellipse = fitEllipse(contours[i]); 
     ellipses.push_back(ellipse); 
    } 
    else 
    { 
     Point2f center; 
     float radius = 0.0; 
     minEnclosingCircle(contours[i], center, radius); 
     ellipses.push_back(RotatedRect(center, Size2f(radius, radius), 0.0)); 
    } 
} 

cvtColor(imgContours, roiInput, CV_GRAY2BGR); 

int baseLine = 0; 
const double fontScale = 0.5; 
const int thickness = 1; 

for(int i = 0; i < ellipses.size(); i++) 
{   
    cv::ellipse(roiInput, ellipses[i], CV_RGB(255, 0, 0), 1, 8); 
    Size textSize = getTextSize(std::to_string((long long)i + 1), FONT_HERSHEY_SCRIPT_SIMPLEX, fontScale, thickness, &baseLine); 
    putText(roiInput, std::to_string((long long)i + 1), Point(ellipses[i].center.x - (textSize.width/2), ellipses[i].center.y + (textSize.height/2)), FONT_HERSHEY_SCRIPT_SIMPLEX, fontScale, 
     Scalar(255, 255, 255), thickness, 8, false);   
}  
return QImage((uchar*)roiInput.data, roiInput.cols, roiInput.rows, QImage::Format_RGB32); 
} 
+0

увидеть это: http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/find_contours/find_contours.html пытаются использовать оператор кэнни перед вызовом findContours() – azer89

+0

Почему это? Этот же код отлично работает в консольном приложении ... – mFeinstein

+0

Ах, извините, не видел этого. Я давно столкнулся с этой проблемой. Проблема была решена после того, как я сменил все проекты в своем решении на VC 2010. Я также использовал Qt Qt версию VC 2010 тоже – azer89

ответ

1

Сегодня я столкнулся с аналогичной ситуацией с OpenCV 2.4.8 при построении проекта Debug на Qt Creator 3.1.2 с использованием MSVC 2013 в качестве компилятора.

Вдруг я заметил, что .pro файл был связывая мое приложение к библиотек OpenCV релиз:

LIBS += -L"C:\\opencv\\build\\x86\\vc12\\lib" \ 
    -lopencv_core248 \ 
    -lopencv_highgui248 \ 
    -lopencv_imgproc248 

, когда он должен быть фактически ссылки на OpenCV отлаживать библиотеки:

LIBS += -L"C:\\opencv\\build\\x86\\vc12\\lib" \ 
    -lopencv_core248d \ 
    -lopencv_highgui248d \ 
    -lopencv_imgproc248d 

Вспомнить детей: проект типа сборки должен м atch Библиотеки OpenCV типа.

+0

Ну, к сожалению, это не мое дело ... Все отлично работает в Debug, у меня есть сбой только в Release, все мои DLL-файлы совпадают. .. Я открыл новую тему и более полную: http://stackoverflow.com/questions/21998478/c-compilation-introduce-errors По-прежнему не удается найти решение ..... – mFeinstein

Смежные вопросы