opencv:使用 cout 和 Mat 对象抛出异常

Posted

技术标签:

【中文标题】opencv:使用 cout 和 Mat 对象抛出异常【英文标题】:opencv: using cout with Mat object throwing exception 【发布时间】:2013-01-17 07:50:38 【问题描述】:

我需要打印我的 Mat 对象,但程序抛出异常...该项目非常简单:创建 Mat 对象并使用 cout 打印 - 就像在 OpenCV 教程中一样:

#include <core/core.hpp>
#include <highgui/highgui.hpp>

#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char *argv[])

    Mat O = Mat::ones(2, 2, CV_32F);
    cout << "O = " << endl << " " << O << endl << endl;

    // Point2f P(5, 1);
    // cout << "Point (2D) = " << P << endl << endl;

return 0;

异常说:Unhandled exception at 0x59430671 (msvcp100d.dll) in printingTest.exe: 0xC0000005: Access violation reading location 0x00000000。仅控制台显示

O = [

它正好停在“operations.hpp”上:

static inline std::ostream& operator << (std::ostream& out, const Mat& mtx)  Formatter::get()->write(out, mtx); return out; 

看起来“out”是空的,但有人知道为什么吗?教程说它应该可以工作......

我之前遇到过类似的抛出异常的问题,我在这里解决了:

http://answers.opencv.org/question/5113/problem-with-reading-image-to-mat/

是否有可能是另一个环境变量冲突?或者可能是碰撞,因为我使用的是 VS2012,而 OpenCV 仅适用于 v10?

被注释的Point2f的东西正常工作。

【问题讨论】:

您使用的是用 VS10 构建的 OpenCV。 DLL 中的ostream operator &lt;&lt; 正在使用来自VC 10 Runtime 的运算符。当您从 VC 11 运行时调用 ostream operator &lt;&lt; 时。 DLL 存在冲突。 附带说明,使用“O”、“l”等名称命名变量不是一个好习惯。 @sgar91 OpenCv 只有 VC10 库。是否有可能只有这不起作用而其他一切都很好?好难过。。 @lightalchemist 谢谢,但正如我提到的,我从 OpenCV 教程中复制了它:) ostream 是 CPP Runtime 的核心类之一。它的实现在不同版本的VC中有所不同。 OpenCV 代码可以工作,但 CPP 运行时的功能会发生冲突。另一种方法(艰难的方法)是使用 VS 2012 重新编译 OpenCV 【参考方案1】:

您的代码在 VS2010 上运行良好。确保您正在链接正确的库(发布与调试)。如果这无济于事,请尝试重新安装 openCV 或在 VS2012 上构建您自己的版本,并使用 cmake 进行准备。

【讨论】:

这就是重点,我在互联网上搜索,有时在某人的计算机上它工作正常,有时不工作。链接库没问题。我也是在 CMake 上构建的,还是一样的错误... 您真的使用 VS2012 使用 cmake 的输出重新编译了整个库并使用这些自构建库吗? 是的,我有。也许我做错了什么?我设置了“源代码在哪里”(C:\opencv - 就是它所在的位置)和“在哪里构建二进制文件”我刚刚在 C:\opencv\opencv_debug 中创建了一个新文件夹。我选择Visual Studio 11作为生成器然后配置,设置ipp和tbb缺少的路径(因为我以后会用到),再次配置然后生成。 CMake 创建了 OpenCV 解决方案,所以我在 VS 中运行它。然后在我的项目中,我在链接器 C:\opencv\opencv_debug\lib\Debug 中设置属性。包含的路径提醒相同。 有效!! Dobi & sgar91 谢谢 :) 你看,我几天前在 CMake 中构建了它,但我没有更改 PATH 变量...(不,我不是金发女郎 :P)我现在想到了它。我还在那里添加了 tbb 的 dll 的路径。现在它可以工作了。真是一种解脱;)

以上是关于opencv:使用 cout 和 Mat 对象抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

opencv中Mat类的输出问题

Mat对象的一些函数和方法的使用

OPENCV对于Mat的理解和操作

OpenCV mat::at 抛出异常

打印 cv::Mat opencv

OpenCV 中 Mat 对象的标头是啥意思?