OpenCV findContours Stack Overflow

时间:2014-02-05 23:04:06

标签: c++ visual-studio-2010 qt opencv

我有一个使用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),我正在将程序编译为调试。

我尝试通过更改属性 - >来扩大堆栈。配置属性 - >链接器 - >系统 - > 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);
}

1 个答案:

答案 0 :(得分: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库类型匹配。