为啥 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 函数在调试时失败并出现异常的主要内容,如果未能解决你的问题,请参考以下文章
为啥 VS2015 调试器不能在监视窗口中正确显示函数地址?
为啥在 VC++ 调试器上计算表达式时会出现“成员函数不存在”错误?