1.OpenCV安装:
首先要看一下安装的VS版本,下载对应vc的opencv版本:
VS版本 | 对应的vc版本 |
VS2005 | vc8 |
VS2008 | vc9 |
VS2010 | vc10 |
VS2012 | vc11 |
VS2013 | vc12 |
VS2015 | vc14 |
VS2017 | vc15 |
opencv版本 | 对应的vc版本 |
opencv 2.4.10 | vc10、vc11、vc12 |
opencv 2.4.13 | vc11、vc12 |
opencv 3.4.0 | vc11、vc12 |
opencv 3.4.1 | vc14、vc15 |
1)下载安装包opencv下载地址 2)选择方便的安装路径(比如D盘)
3)在环境变量中加入opencv路径,如:“;D:\Supports\opencv_3.3\opencv\build\x64\vc14\bin”
工程设置:
注:此处以vs2013为例
1)在VS2013中新建一个C++的win32控制台项目,
2)修改项目的相关配置。具体为:项目–属性-- 3)配置属性–VC++ 目录
#Include path(包含目录):
D:\Supports\opencv_3.3\opencv\build\include
D:\Supports\opencv_3.3\opencv\build\include\opencv
D:\Supports\opencv_3.3\opencv\build\include\opencv2
#Lib path(库目录):
D:\Supports\opencv_3.3\opencv\build\x64\vc14\lib
#链接器--输入--附加依赖项:
opencv_world330.lib
opencv_world330d.lib
至此,OPENCV的开发环境配置完毕。
2.问题&解决
问题1:
错误 1 error LNK2019: 无法解析的外部符号 "void __cdecl cv::fastFree(void *)" (?fastFree@cv@@YAXPAX@Z),
该符号在函数 "public: __thiscall cv::Mat::~Mat(void)" (??1Mat@cv@@QAE@XZ) 中被引用
E:\Practice\Test_opencv\Test_opencv\Test_opencv.obj Test_opencv
原因:
若不是链接库名称设置问题则可能是解决方案平台设置问题,若安装的是x64位的opencv在vs工程下解决方案平台应该改成x64而不是Win32 (VS默认是win32)
解决方案:
选择项目右键->属性->平台(改成活动x64)
问题2:
由于找不到vcruntime140.dll无法继续执行代码
问题原因:
opencv所需的vc版本在电脑上没安装/安装错误
解决方案:
1)首先检查VS版本,对应关系如上表所示
2)若对应关系不对,重装对应版本的opencv,重复安装配置步骤
3)对应关系正确,尝试修复VS对应的vc库模块
问题3:
找不到opencv_world310.dll
问题原因:
系统没有找到加入环境变量path下的dll文件。
解决方案:
方案一:从环境变量下手
确定几个问题:
1.你是不是管理员用户。
2.是否放到系统变量里的path路径下。
3.打开cmd窗口,运行bin下的任意一个exe程序,看能否正常运行。
4.修改完系统变量后最好重启一下计算机,或注销一下用户。
方案二:暴力解决
把这些dll放到跟你的exe一个目录(工程默认加载目录)
或
把这些dll放到C盘Windows System32下(系统默认加载目录)
问题4:
imwrite报错
问题原因:
因保存的内容为单通道图像,故一开始怀疑是因为通道数不对不能存为jpg、png等格式的图片,写了个函数打算把灰度图转为RGB图像后保存:
void Save_image(string filename,Mat image)
{
IplImage *img = &IplImage(image);
int nchannels = img->nChannels;
IplImage *result = cvCreateImage(cvGetSize(img),img->depth,3);
if (nchannels == 1)
{
cvCvtColor(img, result, CV_GRAY2BGR);
imwrite(filename,cvarrToMat(result));
}
else if (nchannels == 3)
{
imwrite(filename, cvarrToMat(result));
}
}
然鹅并没有用,依旧报错中断。
查了挺久发现网上说在debug模式下才会有这种错误,试图把程序改为release模式运行
结果所有有关opencv的东西都不对了,据说是lib包含问题,尝试删除debug相关lib后依旧错误,原因以后再找,先放一放。
最后的解决方案(依旧迷茫,原因以后慢慢查):
imwrite在debug模式下会出错,导致无论三通道还是单通道的图像都不能保存为jpg\png等格式,只能保存成bmp,把图像名后缀改成bmp后可正常保存。
问题5:
在使用VSS2013编译C++程序时,当调用stdio.h库时,比如调用函数snprintf报错
error C3861: “snprintf”: 找不到标识符
问题原因:
snprintf()函数并不是标准c/c++中规定的函数,所以在许多编译器中,厂商提供了其相应的实现的版本。
在gcc中,该函数名称就snprintf(),而在VS中称为_snprintf。
解决方案:
方案1:将snprintf时改成_snprintf
方案2:在预编译处加入:
#if _MSC_VER
#define snprintf _snprintf
#endif
问题后续:
错误 5 error C4996: '_snprintf': This function or variable may be
unsafe. Consider using _snprintf_s instead. To disable deprecation,
use _CRT_SECURE_NO_WARNINGS. See online help for details.
E:\Practice\Test_opencv\Test_opencv\Test_opencv.cpp 202 1
Test_opencv
解决方法:
工程->属性->配置属性->C/C+±>预处理器->预处理器定义
添加以下定义就可以解决:
_CRT_SECURE_NO_DEPRECATE
_SCL_SECURE_NO_DEPRECATE