我在 Visual Studio 2010 中有一个多线程 C++ windows 项目,它使用 Qt (5.1.1) 和 OpenCV (2.4.8)。当我构建它时Debug模式一切运行正常,但是当我构建它时Release模式下程序崩溃。两种配置几乎相同(只是在发布中我有多线程 DLL /MD,在调试中我有多线程调试 DLL /MDd),我禁用了发布的优化,甚至启用了调试来捕获错误。最奇怪的是,崩溃的同一段代码在另一个控制台项目中运行得很好。
该错误是 OpenCV 代码的内部错误,与我的代码无关,我的代码只是:
void MyProject::findEllipses(QImage &frame, vector<RotatedRect> &ellipses)
{
Mat image = Mat(frame.height(), frame.width(), CV_8UC4, frame.scanLine(0));
cvtColor(image, image, CV_RGB2GRAY);
GaussianBlur(image, image, Size(3, 3), 0, 0, 4);
threshold(image, image, treshVal, 255, THRESH_BINARY);
vector<vector<Point> > contours;
Mat contoursImage = image.clone();
findContours(contoursImage, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE, Point(0, 0));
// ....Mode Code
正如我在Debug代码运行没有问题,findContours
calls _contours.create(total, 1, 0, -1, true);
(在OpenCV的contours.cpp的第1720行)并继续该方法......但是在Release,当我踏入_contours.create(total, 1, 0, -1, true)
,程序没有执行该方法,而是跳转到void _OutputArray::clear() const
(matrix.cpp 第 1674 行)并且 get 被困在那里,因为它调用int k = kind();
在它的第一行,而不是调用cv::kind()
, calls:
int _InputArray::type(int i) const
{
int k = kind();
哪些细胞会衰老kind()
再次调用type()
(代替kind()
正如它应该的那样),进行无限递归循环,带来堆栈溢出.
我尝试创建一个新的 Visual Studio 2010 项目来查看这是否是项目创建问题,但问题仍然存在。
我的猜测是,函数地址在发布模式下是错误的,因此当它尝试调用时create()
,它反而调用另一个地址,使堆栈变得混乱,但这只是我的猜测。起初我会责怪 OpenCV 发布的 dll,但是,正如我所说,在另一个仅运行特定代码的控制台项目中,代码在机器人构建模式下运行良好。我不明白我的其他线程和代码如何触发此行为,因为该错误归结为 OpenCV 中的错误函数调用。
这远远超出了我的知识范围,我不知道如何解决这个问题,我感谢我在这个问题上可以获得的所有帮助,因为我已经用尽了我所有的想法来解决它......
EDIT :
我做了一个小项目,这样任何人都可以看到发生了什么。
这些文件位于:https://app.box.com/s/3owljl44emv57erinrf8 https://app.box.com/s/3owljl44emv57erinrf8
为了运行它,您必须拥有 OpenCV 2.4.8 和 Qt 5.1.1 并配置 Visual Studio 2010 项目以从正确的位置获取包含文件。在资源文件夹中,有一个将被加载的图像,并且在 SaraVisualControl.cpp 第 20 行中,您必须放置图像的正确路径,抱歉我没有自动执行此操作,但我急于将其打包到一个小项目。有关如何运行的任何其他问题,请告诉我。
EDIT 2
我发现了这个旧线程:http://code.opencv.org/issues/2218 http://code.opencv.org/issues/2218用户似乎有与我相同的问题,只需在关闭 OPENCV_CAN_BREAK_BINARY_COMPATIBILITY 的情况下运行 CMake 似乎可以解决该问题。但这个选项在新版本的 OpenCV 中不再存在,如此处所述http://code.opencv.org/issues/2358 http://code.opencv.org/issues/2358。有谁知道这的含义以及它如何相关?