vscode是一个轻量级的代码编辑器,但是它没有编译器,因此配置c++和opencv的过程很痛苦。反反复复装了3天,终于把环境配好了。显示出来图片的那一刻,我哭了~
记录一下整个踩坑过程,也分享给需要的朋友。
默认大家已经配好了c++环境。
需要下载的内容有:
下载网址:opencv官网。笔者下载的是4.5.3版本,点击source即可下载到本地。
opencv的扩展项,包含了一些CUDA图像处理模块以及其他图像处理模块。非必须,按需要决定是否下载
下载地址cmake官网下载地址。笔者下载的版本是3.21.1。
mingw64可以在开源网站下载。
笔者下载的是8.1.0版本的压缩包。
cmake不需要安装,直接解压即可。
mingw64也不需要安装,解压即可。但是需要配置环境变量,将所在目录下的bin目录添加到系统环境变量中。
需要注意的是,mingw64的路径下必须是全英文,而且路径中不能有空格,不能有空格,不能有空格!之前笔者把mingw64放在了Problem File文件夹下,结果在编译的时候找不到路径。报了**D:\Problem File\mingw64\bin\windres.exe: preprocessing failed.**
opencv下载的是源码,无需安装。创建一个文件夹opencv,将源码解压到该文件夹下。
如图,在源码文件夹同级目录下创建一个opencv_build文件夹,用来编译opencv。这里,opencv-4.5.3是解压的源码。
打开cmake文件夹的bin目录,双击cmake-gui,打开gui界面。
点击1,选择opencv源码路径。
点击2,选择编译结果存放的目录,该目录需要是一个空目录。
点击3Configure,开始编译。中间会有进度条显示,当编译结束后,会显示Configure done。
然后在显示红色的4这里,选中WITH_OPENGL,选中BUILD_opencv_world可以把所有的组件综合到opencv_world453.dll中,方便后续添加依赖项。取消勾选WITH_IPP、取消勾选ENABLE_PRECOMPILED_HEADERS、取消勾选OPENCV_GENERATE_SETUPVARS可以解决下图警告。
再次点击Configure编译,直到1区域全部变成白色,2区域没有红色的warning警告。
如果遇到警告FFMPEG: Download failed: 6;“Couldn‘t resolve host name“
,参考博客中的解决办法,直到所有的红色警告消失。点击Generate。完成后,2区域会显示done。
打开opencv_build文件夹,右键单击选择在终端打开。
输入mingw32-make -j4
,回车开始编译。用make -j带一个参数,是为了加速make。表示并行编译,比如在一台双核的机器上,完全可以用make -j4,让make最多允许4个编译命令同时执行,这样可以更有效的利用CPU资源。
到这一步,恭喜你编译成功。
接下来,输入mingw32-make install
,进行安装
执行这一步时,需要管理员权限。如果刚才打开cmd时没有申请管理员权限,会报Permission denied
。
这时需要把当前终端关闭。在开始栏搜索cmd,以管理员身份运行。
cd到你build opencv的文件目录下,重新执行上述install命令。
感受一下成功的喜悦~。
把编译好的bin目录添加进环境变量。这里,C:\work\opencv\opencv_build是刚才编译的目录。
C:\work\opencv\opencv_build\bin
C:\work\opencv\opencv_build\install\include
C:\work\opencv\opencv453_build\install\x64\mingw\bin
vscode本身没有新建项目的选项,所以要先创建一个空的文件夹。
打开vscode,
点击File->open folder。在弹出的文件管理器中,打开文件夹。
点击这里,添加文件夹,命名为.vscode
点击.vscode文件夹,点击红框生成新的文件。需要四个文件:
需要四个文件:
接下来,复制对应的文件内容:
setting.json
{
"C_Cpp.errorSquiggles": "enabled",
"C_Cpp.default.includePath": [
// 下面的两个路径需要改为自己的路径。C:/work/opencv/opencv453_build是我编译opencv的路径
"C:/work/opencv/opencv453_build/install/x64/mingw/lib",
"C:/work/opencv/opencv453_build/install/include/"
],
"code-runner.executorMap": {
"c": "cd $dir && gcc '$fileName' -o '$fileNameWithoutExt.exe' -Wall -g -O2 -static-libgcc -std=c11 -fexec-charset=UTF-8 && &'$dir$fileNameWithoutExt'",
// 下面三个路径,也需要改为自己的路径
"cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt -I C:/work/opencv/opencv453_build/install/include -I C:/work/opencv/opencv453_build/install/include/opencv2 -L C:/work/opencv/opencv453_build/install/x64/mingw/lib -llibopencv_world453 && $dir$fileNameWithoutExt "
},
"files.associations": {
"iostream": "cpp"
}
}
launch.json:
{
"version": "0.2.0",
"configurations": [
{
"name": "opencv4.5.3 debuge",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
// 这里,需要改为自己的mingw路径
"miDebuggerPath": "D:/mingw64/bin/gdb.exe",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": false
}
],
"preLaunchTask": "opencv4.5.3 compile task"
}
]
}
tasks.json:
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "opencv4.5.3 compile task",
// 这里需要改为自己的mingw路径
"command": "D:/mingw64/bin/g++.exe",
"args": [
"-g",
"${file}",
"-o",
"${workspaceFolder}\\${fileBasenameNoExtension}.exe",
// 下面三个路径改为自己对应的opencv编译路径
"C:/work/opencv/opencv453_build/install/x64/mingw/bin/libopencv_world453.dll",
"-I",
"C:/work/opencv/opencv453_build/install/include",
"-I",
"C:/work/opencv/opencv453_build/install/include/opencv2"
],
"options": {
// 这里改为自己的mingw路径
"cwd": "D:/mingw64/bin"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"presentation": {
"panel": "new" //默认为“shared“表示共享,改成new之后每个进程创建新的端口
}
}
]
}
c_cpp_properties.json:
{
"configurations": [
{
"name": "win",
"includePath": [
"${workspaceFolder}/**",
// 下面6个路径改为自己对应的路径
"C:/work/opencv/opencv453_build/install/include",
"C:/work/opencv/opencv453_build/install/include/opencv2",
"D:/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include",
"D:/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++",
"D:/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/x86_64-w64-mingw32",
"D:/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/x86_64-w64-mingw32/32"
],
"defines": [],
// 改为自己的mingw路径
"compilerPath": "D:/mingw64/bin/gcc.exe",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
这样,配置就完成了。接下来,写一个测试代码验证下
在test.cpp里,写一段测试代码,读取一个图像并显示。
#include
#include
#include
int main()
{
cv::Mat img = cv::imread("C:/work/x2/data/pick_data/0.jpg");
cv::imshow("i", img);
cv::waitKey(0);
return 0;
}