hellodrx1的个人博客分享 http://blog.sciencenet.cn/u/hellodrx1

博文

【opencv】cout显示Mat类对象会跳出exceptional的解决方法

已有 8536 次阅读 2013-7-29 20:40 |个人分类:opencv学习|系统分类:科研笔记| OpenCV, Mat类对象

这一个月都在看《learning opencv》,一直蛮好奇里面的接口怎么都用c写的。做课后习题时,网上一些同学给的答案也都是c写的...然后昨天晚上看opencv2.4.6的tutorials,才知道从2.0以后官方提供了c++的接口,也不推荐以前的c了0,0。所以昨晚到现在果断在看新的C++接口。

 

边看tutorials边练习新的接口,当看到Creating a Mat object explicitly这一节开头,有一段很简单的代码

 

这段代码的手写版如下:

 

 Mat M(2,2,CV_8UC3,Scalar(255,0,0));

cout<<"M="<<endl<<" "<<M<<endl<<endl;

 

就这么简单的两行代码,居然无法执行一直跳exceptional你敢信????单步运行发现M是可以正常分配内存,但是执行到第二行cout后面的语句就不行了。VS弹出了“operations.hpp”,并且停在如下代码:

static inline std::ostream& operator << (std::ostream& out, const Mat& mtx)

{

Formatter::get()->write(out, mtx);

return out;

} 

 

出现这个问题,我第一感觉是环境没配好。但是同样的环境,我之前写了一个半月的opencv代码也没出过问题,就很迷茫。问度娘也没有靠谱的答案,所以只好google之,搜了半天才找到答案。先给两个传送地址

 

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

地址2:http://stackoverflow.com/questions/14374407/opencv-using-cout-with-mat-object-throwing-exception

 

这两个帖子的作者都是同一个人,囧....他碰到了两个问题,一个是用imread函数,跳出exceptional--Unhandled exception at 0x5B9665AF (msvcr90d.dll) in opencv_test.exe: 0xC0000005: Access violation reading location 0xCCCCCCCC.。

 

第二个就是我碰到的那个问题,Mat对象无法用cout显示。

 

解决方法:

我和这位外国友人都出了同样的问题。我之前用的平台是vs2010,一个月前换了vs2012。他之前是VS2008,现在换了VS2012。他认为之所以出现这种问题,是因为删除vs2008出现了问题,缺失了某些.dll。

 

针对第二个问题,就是cout无法显示Mat类,狂跳exceptional,有专业的网友给出了原因,他的意思大概是你想用VS2012的<<操作符,但是dll的ostream operator<<其实是用的vs2010的<<,结果两者冲突了。所以导致exceptional的出现。

 

我英语也不好,只能领会个大概,但应该是这个原因。我记得当初删除vs2010时,是用的2010的安装光盘的删除功能,按理说自家的删除工具应当比较干净。但是在我安装目录G盘下还是留有2010的文件夹。

就是图中的这个Visual Studio 10.0。

 

知道原因后,我的解决方法如下。

 

第一,还是进入系统的环境变量和系统变量,就是当初设置opencv的PATH路径,确保你所有的路径设置都是VC11,而不是VC10,我们知道VC10只试用与vs2010以前的版本,而VC11是2.4.4以后才有的,专门搭配VS2012平台。

 

如果当初有用过vs2010,在里面设置过vc10下的lib,后来又把平台换成VS2012,设置了VC11的路径而忘记删除VC10,这次请把以前vc10的路径删掉,只保留VC11。

 

第二,把VS2010残留的文件夹删除,我的就是那个visual studio 10.0。只需要删除当初残留的安装目录,我的文档里的也是有残留vs2010的工程文件夹什么的,那个不需要删除。

 

 

 

经过这两个简单的步骤,程序可以正常运行。结果如下

 

#include "stdafx.h"

 

#include "opencv2/core/core.hpp"
#include <iostream>

using namespace std;
using namespace cv;

 

void main()
{
 
Mat M(2,2,CV_8UC3,Scalar(255,0,0));

cout<<"M="<<endl<<" "<<M<<endl<<endl;

getchar();
}

 

 

比较好笑的是,把visual studio 10.0那个文件夹删除后,运行代码正常,然后再从回收站将它还原,vs2012也不会再跳出“operations.h"这个exceptional。大家可以试试0,0。

 

 

 

 

 

 



https://blog.sciencenet.cn/blog-972981-712339.html

上一篇:【opencv】1.学习opencv课后习题chapter4遇到的问题
收藏 IP: 202.103.47.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-21 15:38

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部