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

Posted

技术标签:

【中文标题】为啥 cv::meanStdDev 函数在调试时失败并出现异常【英文标题】:Why cv::meanStdDev function fails with exception on debug为什么 cv::meanStdDev 函数在调试时失败并出现异常 【发布时间】:2012-07-06 09:41:01 【问题描述】:

我正在为 ios 平台开发一个 opencv 应用程序。我自己为调试和发布方案编译了opencv,但是当我尝试使用调试方案运行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方案时,由于这个kind()函数的结果,执行用CV_Assert函数调用检查一些数据,然后失败。

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

【问题讨论】:

这类问题有更多机会在 OpenCV 邮件列表中获得正确答案。太具体了。 【参考方案1】:

这是您的整个程序吗? 如果不是,则可能会出现堆损坏,这在 OpenCV 上很常见,因为对 Mat 元素的访问错误。

例如:

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

如果你写的程序段之前有这样的代码,你的堆有可能损坏了,那么你必须修复它。 在发布模式下,您可能正在破坏不干扰这部分代码的另一个区域,但在调试中看起来确实如此。

但如果这是你的全部代码,我也帮不上什么忙……对我来说它看起来很合适。

【讨论】:

是的,我在这个块之前和之后有更多的代码,但是矩阵是在这里初始化的。其余代码是 ios 应用程序初始化,因此不应损坏矩阵。感谢你的回答! ;)

以上是关于为啥 cv::meanStdDev 函数在调试时失败并出现异常的主要内容,如果未能解决你的问题,请参考以下文章

搜索图片及相似度探秘 一

python opencv:像素运算

为啥 VS2015 调试器不能在监视窗口中正确显示函数地址?

为啥在 VC++ 调试器上计算表达式时会出现“成员函数不存在”错误?

Delphi:使用调试器调用 C dll 函数需要 15 秒,而没有调试器需要 0.16 秒。为啥?

在 Visual Studio 2022 中调试时,C++ 语言的子函数内“读取字符串字符时出错”,这是为啥?