OpenCV findContours 堆栈溢出

Posted

技术标签:

【中文标题】OpenCV findContours 堆栈溢出【英文标题】:OpenCV findContours Stack Overflow 【发布时间】:2014-02-05 23:04:05 【问题描述】:

我有一个使用 Qt 5.1.1 和 OpenCV 2.4.6 的 C++ 项目。图像处理算法在单独的线程中运行。一切正常,但如果我调用 OpenCV 函数 findContours() 程序崩溃并显示堆栈溢出消息(在第一次调用此函数时,不像之前已经调用过多次)"未处理的异常在 SARA.exe 中的 0x56ec9a47:0xC00000FD:堆栈溢出。”

我找到了same problem 的人,但在他的情况下,只需将项目更改为 Visual Studio 2010……但在我的情况下,我的项目已经在 VS2010 中。

如果我创建一个单独的控制台项目,该算法运行良好,它只调用图像处理算法,但我的 Qt 项目中线程内的相同代码显示堆栈溢出!如果我删除 findContours() 函数,一切正常。在这两个项目中,我使用相同的库和调试 dll(版本为 xxx246d.dll),并将程序编译为调试。

我试图通过更改 Properties -> Configuration Properties -> Linker -> System -> Stack Reserve Size 选项来使堆栈变大,但随后程序仍然崩溃,并显示不同的消息, “SARA.exe 中 0x76e5c41f 处的未处理异常:Microsoft C++ 异常:内存位置 0x14c7adc8 处的 Concurrency::scheduler_resource_allocation_error..”

我不认为这是代码问题,因为它作为控制台应用程序运行良好,但如果有人想看到它,它会这样:

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

【问题讨论】:

看到这个:docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/… 在调用 findContours() 之前尝试使用 Canny 边缘检测器 为什么?相同的代码在控制台应用程序中运行良好... 抱歉,没看到。我很久以前就遇到过这个问题。在我将解决方案中的所有项目更改为 VC 2010 后,问题就解决了。我也使用了 Qt Qt 版本的 VC 2010 是的...但我已经在使用它们了:/ 嗯,好吧,使用不同的线程是什么意思? 【参考方案1】:

今天我在使用 MSVC 2013 作为编译器在 Qt Creator 3.1.2 上构建 Debug 项目时,在使用 OpenCV 2.4.8 时遇到了类似的情况。

突然,我注意到 .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

记住孩子们:项目构建类型应该匹配OpenCV库类型

【讨论】:

不幸的是,这不是我的情况...在调试中一切正常,我只有在发布时崩溃,我的所有 dll 都匹配...我打开了一个新线程,并且在这里:***.com/questions/21998478/… 还是找不到解决办法.....

以上是关于OpenCV findContours 堆栈溢出的主要内容,如果未能解决你的问题,请参考以下文章

Opencv关于findcontours中断问题

堆栈缓冲区溢出会导致堆损坏吗?

堆栈和堆溢出利用是啥意思

缓冲区溢出及堆栈/堆操纵

什么是堆栈溢出?

用例子解释编程中的栈溢出和堆溢出? [复制]