在调试配置中将两个 cv::Mat 矩阵与 opencv 3.0/3.1 相乘时出现 cv::Exception

GpG*_*GpG 6 c++ opencv visual-studio

我在运行以下代码时观察到异常(Microsoft C++ 异常:内存位置 0x000000000028C510 处的 cv::Exception。):

cv::Mat a(5,60, CV_32FC1);
cv::Mat b(60,5, CV_32FC1);
cv::Mat c = a*b;

cv::Mat d(5, 60, CV_32FC1);
cv::Mat e(60,5, CV_32FC1);
cv::Mat f = d*e; 
Run Code Online (Sandbox Code Playgroud)

执行第三行代码时抛出异常:

cv::Mat c = a*b;
Run Code Online (Sandbox Code Playgroud)

之后不再发生( cv::Mat f = d*e; 不再抛出)。调试将我引导到以下 opencv 的功能:

inline
MatExpr::operator Mat() const
{
    Mat m;
    op->assign(*this, m);
    return m;   <- this is supposed to throw the exception
}
Run Code Online (Sandbox Code Playgroud)

如果我写:

auto c = a*b;
Run Code Online (Sandbox Code Playgroud)

而不是抛出异常,而是在最后一次调用时抛出:

cv::Mat f = d*e;
Run Code Online (Sandbox Code Playgroud)

仅在调试模式下和使用opencv 3.03.1时才会抛出异常。在发布模式或使用 opencv 2.4 时不会抛出异常。

我在 Visual Studio 2013 和 2015 中尝试过。我使用了预构建的 opencv 版本,可从官方 opencv 的网页下载。我检查了正确的 opencv 库是否根据 VS 版本链接。我只试过 64 位。我也在其他计算机上尝试过,所有计算机都装有 Windows 7,并得到了相同的行为。

论坛上已经发布了一些具有类似标题的问题,但没有人解决这一特定问题。

最后,程序正常运行,我知道我可以在 VS 中关闭这种异常并忘记它,但无论如何,我想了解这种奇怪行为的原因可能是什么。有没有其他人经历过类似的事情?