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 堆栈溢出的主要内容,如果未能解决你的问题,请参考以下文章