准备工作:创建一个基于对话框的MFC项目(我使用的是vs2019),且已经下载了opencv包。这里不多赘述:
随后就是配置环境变量和在项目中引入opencv的相关文件了,这部分操作有很多教程,也略过。这篇写得很详细,推荐参考:
mfc | mfc集成opencv,实现监控、拍照、录像、录像播放(保姆级教程)_mfc录屏软件-优快云博客
(大致就是把opencv中的include和lib文件加入项目文件夹下,再在项目属性中的(VC++)库目录、(C/C++ _常规)附加包含目录和(链接器->输入)附加依赖项中添加对应的文件。)
一、在项目属性中配置好opencv后依旧报错
以上这些步骤完成后,也引入了opencv头文件,使用了cv命名空间,但仍然大量报错,好像没有引入一样(还有一种情况是确实没任何报错,但是编译一直失败):
解决方法:1、先试试“清理解决方案+重新生成解决方案”的组合拳,然后关闭vs,重新打开项目。之前有些类似的问题这样就解决了。当然,这次失效了。
2、打开“视图-其他窗口-属性管理器”,然后在右边就可以打开,如图。
如图,观察你是Debug/Release + x64/x86中的哪个组合,然后在右边找到对应的,点击右键-属性,然后就到了最初项目配置熟悉部分。在这里重新进行一开始的配置过程,复读坤:大致就是把opencv中的include和lib文件加入项目文件夹下,再在项目属性中的(VC++)库目录、(C/C++ _常规)附加包含目录和(链接器->输入)附加依赖项中添加对应的文件。
配置完成后,点击确定,运行,可无报错成功编译。
二、std与cv命名空间冲突问题
添加了#include <opencv2/opencv.hpp>
#include<opencv2/highgui/highgui_c.h>
using namespace std;
using namespace cv;
等语句后,会报错:"ACCESS_MASK":不明确的符号。
原因:opencv的using namespace cv和windows.h中ACCESS_MASK定义冲突。
我的程序中使用opencv的部分不太多,所以···
解决:不使用using namespace cv;命名空间,一律改用cv:: (敷衍)
三、C2653 “cv”: 不是类或命名空间名称
解决了问题二后紧接着就是这个报错,当然其他所有cv命名空间的变量也会一起报错“未定义标识符xxx”。而且错误列表上方显示“未找到相关问题”,代码也未标红,但错误列表里依旧有很多报错,编译也失败。重新生成解决方案+重启,无效。最终搜索后得到解决方法,有效。
在“项目--属性--C/C++ 预编译头”中,把预编译头改成“创建(/YC)”,问题解决。
至于其中原理,参考这篇文章,写得很详细:
为什么要使用预编译头_是否使用预编译头文件有什么影响-优快云博客
最后再补充一个:我在做发布版本时,把配置和平台换成了release和x64,再次给各个位置添加了依赖的文件。此时在release下需要把“链接器-输入-附加依赖项”中的lib文件改为不带d的那个lib文件,如图。(或两个lib文件都写上,但是不带d的放前面)
如果未修改此处,可能会引发这个报错:LNK2001 无法解析的外部符号 "public: void __cdecl cv::Mat::copyTo(class cv::_OutputArray const &)const " (?copyTo@Mat@cv@@QEBAXAEBV_OutputArray@2@@Z)