|||
这一个月都在看《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。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2025-1-9 14:18
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社