Windows 下使用 VS Code 配置 OpenCV 开发环境
通过使用 GitHub 上他人编译好的动态库,进行 OpenCV 环境的配置。
目录配置环境的前置知识非常多,在此一一罗列
- 环境变量的作用
- MinGW 不同版本的差异
- C/CPP 文件的编译与链接
- 动态链接与静态链接
- OpenCV 编译后的文件夹的结构
- g++ 编译命令中
-I, -L, -l
三个参数的含义 - VS Code 开发 CPP 项目,生成的三个
.json
文件的作用
MinGW 安装
选择 POSIX
这里涉及到 环境变量 相关的知识。
来到 https://sourceforge.net/projects/mingw-w64/files/
看到
MinGW-W64 GCC-8.1.0
- x86_64-posix-sjlj
- x86_64-posix-seh (请选择这个版本下载)
- x86_64-win32-sjlj
- x86_64-win32-seh
- i686-posix-sjlj
- i686-posix-dwarf
- i686-win32-sjlj
- i686-win32-dwarf
如果之前从未使用过 MinGW,那么请下载 posix 类别,并配置环境变量;
如果之前使用过 MinGW,那么你大概率下载的是 win32 类别,所以请重新安装并配置环境变量。
就算不编译 OpenCV 源码,要用它提供的动态链接库,也得老老实实使用 posix 那个。
下载和配置环境变量的过程可以参考 win10 系统 VSCODE 配置opencv。
保留两个 MinGW
我自己之前下载的是 win32 ,所以直接踩坑。
最后我通过修改文件夹名字的方法,把两中 WinGW 都留下来,等以后要换的时候,再改回来。
# 我自己使用的部分系统环境变量
GCC_WIN32_HOME: C:\Library\mingw64-posix
GCC_POSIX_HOME: C:\Library\mingw64-win32
Path:
***
%GCC_POSIX_HOME%\bin
***
关于 win32 和 posix 的区别,请参考[1][2]。
检验是否成功
g++ --version
C:\Users\User>g++ --version
g++ (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
看第二行,有 posix 字样。
C/CPP 文件的编译与链接
- 如果你是只会写单个
.c/.cpp
文件的小白 - 如果你没有上过 计算机组成、编译原理 和 操作系统 这三门课
- 如果你没有听说过
readelf
,objdump
,.text/.data/.bss
我建议你先打好基础,再来配置 OpenCV,否则欲速则不达,就算手把手教会如何配置,
知其然而不知其所以然,下回配置环境还是得折腾一遍。
我先抛出一个问题:
一句简单的
printf("hello world");
,在我的电脑上编译出了.exe
文件,能直接在另一台电脑上运行?我为什么不用手动实现printf
这个函数,别人也不用实现,这个函数到底定义在了哪里,实现在了哪里?
放两个视频:
如果能看懂任何一个,那么就可以继续下去。
OpenCV 文件夹结构
版本选择
本文通过使用别人编译好的 OpenCV dll 文件,保证编译后的文件能够运行。
这份文件在 GitHub 仓库 上可以下载,GitHub 下载的加速,可以参考 FastGit 使用指南。
我使用的版本是 OpenCV 4.1.0-x64
,OpenCV 4.5.5-x64
我试了不行。
所以为了保证成功,用 4.1.0
。
文件结构
C:\LIBRARY\CPP\PACKAGES\OPENCV-MINGW-BUILD-OPENCV-4.1.0-X64
├─etc # 不用管
├─include # 头文件
│ └─opencv2
│ ├─calib3d
│ ├─core
│ ├─dnn
│ ├─features2d
│ ├─flann
│ ├─... # 不一一罗列
└─x64
└─mingw
├─bin
│ └─ *.dll # 一堆 dll 文件
└─lib
首先,include
文件夹,字面意思,用来 include 的。
我们知道 CPP 是定义和实现分离的,以函数为例,通常在 .h
文件中声明,在 .cpp
文件中实现。
如果 main.cpp
里使用了其他文件中定义的函数,而我们只是想要生成 .o
文件,只需要 include
对应的 .h
文件即可。
include/opencv2
下就是各种 .h
文件。
然后是 x64/mingw/bin
,这里有一堆 *.dll
,这就是动态链接库文件。
将动态链接库添加到系统环境变量
为了让第三方的动态链接库生效,我们需要将动态链接库添加到系统环境变量。
对于我来说,是将 C:\Library\CPP\Packages\OpenCV-MinGW-Build-OpenCV-4.1.0-x64\x64\mingw\bin
添加到环境变量中。
这一步的作用类似于告诉系统 prinf()
这个函数的二进制文件在哪儿。
g++ 命令的参数
介绍三个参数 -I
、-L
和 -l
。
-I
告诉编译器,头文件里的 include<package>
去哪儿找。
-L
告诉编译器,添加一个要动态链接的目录
-l
指定具体的动态链接库的名称
具体可以参考 gcc -L -l -I -i参数
VS Code 项目配置
我们使用 VS Code 生成的三个 .json
文件来配置 OpenCV 项目,而不是使用 cmake。
这三个文件分别是:
c_cpp_properties.json
,launch.json
和 tasks.json
。
c_cpp_properties
这个文件删了,不影响 编译 与 链接,但是 VS Code 的 IntelliCode 插件依赖于这个文件。
{
"configurations": [
{
"name": "Win64",
"includePath": [
"${workspaceFolder}/**",
"C:/Library/CPP/Packages/eigen-3.3.8",
"C:/Library/CPP/Packages/OpenCV-MinGW-Build-OpenCV-4.5.5-x64/include"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"compilerPath": "C:/Library/mingw64-posix/bin/g++.exe"
}
],
"version": 4
}
includePath
:告诉插件,要用的依赖在哪儿,我自己电脑上还有 eigen
这个第三方库。
compilerPath
: 告诉插件,编译器的路径在哪儿
tasks.cpp
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe 生成活动文件",
"command": "g++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"-I",
"C:/Library/CPP/Packages/eigen-3.3.8",
"-I",
"C:/Library/CPP/Packages/OpenCV-MinGW-Build-OpenCV-4.1.0-x64/include",
"-L",
"C:/Library/CPP/Packages/OpenCV-MinGW-Build-OpenCV-4.1.0-x64/x64/mingw/bin",
"-l",
"libopencv_calib3d410",
"-l",
"libopencv_core410",
"-l",
"libopencv_dnn410",
"-l",
"libopencv_features2d410",
"-l",
"libopencv_flann410",
"-l",
"libopencv_gapi410",
"-l",
"libopencv_highgui410",
"-l",
"libopencv_imgcodecs410",
"-l",
"libopencv_imgproc410",
"-l",
"libopencv_ml410",
"-l",
"libopencv_objdetect410",
"-l",
"libopencv_photo410",
"-l",
"libopencv_stitching410",
"-l",
"libopencv_video410",
"-l",
"libopencv_videoio410",
"-l",
"opencv_ffmpeg410_64",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
这个文件想要看懂,就需要 g++
命令那些参数的相关知识了,而那些参数相关的知识,就是编译和链接。
isDefault
:表示这是默认的构建任务,可以发现,-l
后面跟着的参数,就是我们下载的 OpenCV的 bin
下的 动态链接库 的文件名。
launch
配置 debug 用的,但是我一直没法 debug,也不知道哪儿出问题了。
构建并运行
准备一个test.cpp
,内容如下,注意修改对应的图片地址。
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace cv;
int main()
{
Mat img = imread("C:/Users/Pictures/avatar.jpg");
imshow("image", img);
waitKey();
return 0;
}
点击小三角就行。
可能无法在 VS Code 中直接运行生成好的 text.exe
文件,可以在资源管理器中双击 .exe
文件运行。