为什么cv :: meanStdDev函数在调试时失败并出现异常

时间:2012-07-06 09:41:01

标签: c++ ios opencv

我正在为ios平台开发一个opencv应用程序。我有自己编译的opencv用于调试和发布方案,但是当我尝试使用Debug方案运行cv::meanStdDev函数时,应用程序失败并出现异常(使用Release它可以正常工作)。 测试功能非常简单:

float list[] = {1.2,1.2,1.3,0.3,6.5,2.2,0.9,0.8,0.9};
cv::Mat test(1,9,CV_32F, list);
cv::Scalar mean1, stddev1;
cv::meanStdDev(test, mean1, stddev1);
printf("[%f, %f]", mean1.val[0], stddev1.val[0]);

此函数在Release方案上正常工作,但在Debug上,它会引发如下异常:

OpenCV Error: Assertion failed (dims == 2 && ((sizes[0] == sz.height && sizes[1] == sz.width) || (allowTransposed && sizes[0] == sz.width && sizes[1] == sz.height))) in create, file /Users/jgoenetxea/libraries/OpenCV-2.4.0/trunk/opencv/modules/core/src/matrix.cpp, line 1375
terminate called throwing an exception

此行是矩阵类的“创建”函数。 在这一点上,kind()函数在同一矩阵的Debug和Release方案中给出了不同的值。选择Debug方案时,由于此kind()函数的结果,执行会使用CV_Assert函数调用检查某些数据,然后失败。

有什么想法吗?有人知道我能检查什么?

1 个答案:

答案 0 :(得分:4)

这是你的整个计划吗? 如果不是,则存在堆损坏的可能性,这在OpenCV上非常常见,因为对Mat元素的访问是错误的。

例如:

Mat<uchar> mat(2,2);
mat.at<float>(1,1)=0.1;

如果在您编写的程序段之前存在此类代码,则可能是您的堆已损坏,那么您必须修复它。 在发布模式下,您可能正在破坏另一个不会干扰此部分代码的区域,但在调试中它看起来就像它一样。

但如果这是你的整个代码,我不能帮助太多......它看起来对我来说。