下载并安装 opencv
首先,进入opencv官网 https://opencv.org/releases/ 下载 opencv。
如果是直接搜索 opencv 并进入的,可以依次单击 Resources —> Releases 进入对应下载页面。
下载下来是一个可执行文件,运行后可以把在 window 上编译好的 opencv 释放到指定目录
目录结构如下
VS2019 创建项目
创建项目时选择 “空项目”,opencv 程序是运行在控制台程序上的。
控制台负责输入输出,opencv 的 highgui 用来渲染和显示窗口。
“属性管理器”
依次点击 “视图” —> “其他窗口” —> “属性管理器” 打开属性管理器
在项目上右键,添加新项目属性表
添加好项目属性表后,就会在项目目录生成一个 “属性表” 文件。到时候创建其它项目,只需要在属性管理器添加一下 “现有属性表” 即可。
PropertySheet.props 文件内容如下
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<IncludePath>D:\workspace\opencv\opencv\build\include\opencv2;D:\workspace\opencv\opencv\build\include;$(IncludePath)</IncludePath>
<LibraryPath>D:\workspace\opencv\opencv\build\x64\vc15\lib;$(LibraryPath)</LibraryPath>
<ExecutablePath>$(ExecutablePath)</ExecutablePath>
</PropertyGroup>
<ItemDefinitionGroup>
<Link>
<AdditionalDependencies>opencv_world430.lib;opencv_world430d.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<ClCompile>
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
</ItemDefinitionGroup>
<ItemGroup />
</Project>
入门代码
在 “解决方案资源管理器” 的 “源文件” 目录下,新建一个 cpp 文件,贴入如下代码
#include <iostream>
#include <opencv2/highgui.hpp>
using namespace cv;
using namespace std;
int main() {
Mat image;
image = imread("D:\\Users\\chy55\\Desktop\\QQ截图20200426154609.png"); //这里换成自己计算机上的本地图片
if (image.empty()) {
cout << "Could not open or find the image" << std::endl;
return -1;
}
namedWindow("Display window", WINDOW_AUTOSIZE);
imshow("Display window", image);
waitKey(0);
std::cout << "Hello World!\n";
}
运行成功
第一次运行会有点久!!!
运行成功后,会有两个窗口。一个是控制台,用来进行输入输出;另一个是 opencv 的 highgui 创建的窗口。
遇到的问题
运行提示找不到 opencv_world320.dll
解决办法是:把 opencv/opencv/build/x64/vc15/bin
下面的 dll 复制到 C:\Windows\System32
再运行项目即可。
注意:把 opencv/opencv/build/x64/vc15/bin
目录添加到系统环境变量中,然后再重启或注销系统,也是可以解决这个问题的
imread 出来的图片 empty
如下这段代码,用 win32 的 Shlwapi 里的 PathFileExistsA 来判断,文件是存在的。但使用 imread 去读,却得到 empty 的返回。
#include <iostream>
#include <opencv2/highgui.hpp>
#include <Shlwapi.h>
#pragma comment(lib, "Shlwapi.lib")
using namespace cv;
using namespace std;
int main() {
string filePath = "D:/workspace/MFC/opencv/res/123.jpg"; //这里换成自己计算机上的本地图片
if (PathFileExistsA(filePath.c_str())) {
cout << "File is exists " << endl;
}
Mat image = imread(filePath);
if (image.empty()) {
cout << "Could not open or find the image" << std::endl;
return -1;
}
waitKey(0);
return 0;
}
解决方案
- 项目 —> 属性 —> "项目的属性页"对话框
- 属性管理器 —> PropertySheet —> "PropertySheet属性页"对话框
依次展开,配置属性 —> 链接器 —> 输入,可以看到如下图。
OpenCV 仅支持 x64,左上角如果配的是 Debug,附加依赖项就用带 d 的 lib,否则用另一个。如果像下图这样,两个都填,则有可能报错。
原因
LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到DLL文件。由于 Debug 版本未经编译器优化且包含调试信息,因此函数地址与 Release 版本是不同的,这就可能导致 LIB 指向一个错误的地址,从而得到错误的输出了。