我有一个使用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),并且将程序作为debug进行编译。
我试图通过更改属性->配置属性->链接器->系统->堆栈保留大小选项来使堆栈变大,但是该程序仍然崩溃,并显示不同的消息,并说“0x76e5c41f中未处理的异常SARA.exe:Microsoft C++异常:内存位置0x14c7adc8处的并发:: 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);
}
最佳答案
今天,在使用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
记住 children :项目构建类型应该与相匹配OpenCV库类型。
关于c++ - OpenCV findContours堆栈溢出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21590514/