再整理:Visual Studio Code(vscode)下的基于C++的OpenCV的最新搭建攻略解析


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:

参考内容:将VSCode打造成OpenCV的IDE(C++, window10 1803)

目录:

1.前言

2.vscode下配置opencv的逻辑分析

3.MinGW、Python与CMake的下载与安装

4.OpenCV的下载与配置

5.利用Cmake对OpenCV源文件进行编译(重中之重)

6.利用minGW32-make对生成的makefile相关文件进行编译和装载。

7.修改vscode调试配置文件

8.常见问题与解决方案(不定时更新)

1.前言

近期因为学习OpenCV的需要,考虑到本身使用vscode已经十分顺手,以及vs下调试运行慢和工程文件臃肿等问题,打算利用已有的VScode对OpenCV环境进行搭建。出于中文互联网上有关文献较为过时, 对应的OpenCV版本较老(对为3.4.5左右),且耗时一周多以来照着过时文献反复调教始终没有顺利地复现博主们成功的情况,出现诸如Cmake的configure失败、利用mingw32-make对生成的cmake文件的各种编译失败、vscode头文件解析失败、g++的各种编译失败以及编译成功后gdb的载入失败等等。经历了一周多的摸索,终于摸清配置Opencv的一些关键要点和大致原理,成功在两台电脑设备下通过同样的操作进行了成功复现,故写下此文,谨以缅怀自己逝去的青春以及为各位需要相关搭建的探索者们一份宝贵经验。

对于阅读操作以下内容的读者,需要以已完成vscode对C++环境配置为前提进行如下操作。若未完成,可。

测试环境:2020/10/20|windows10 x64|vscode 1.50.1|Mingw x64 posix seh|Cmake x64 3.19.0|Opencv 4.5.0

2.vscode下配置opencv的逻辑分析

vscode本身仅作为轻量化的文本开发环境,对于opencv的支持与vs下opencv的支持有着很大的不同,且配置繁琐度不亚于对vscode进行C/C++语言环境的搭建难度。想要使vscode能够支持windows下基于C++及mingw的OpenCV开发环境,需实现以下几个关键步骤:使vscode能够支持对于opencv的库导入和语法提示、使gcc支持对含有opencv源代码的编译、使gdb支持对含有opencv代码的可执行程序的调试。

对于opencv的库导入和语法提示,可直接通过修改.vscode配置文件中c_cpp_properties.json实现。

对于gcc对含有opencv源代码的编译,需修改task.json中编译命令行中加入相关头文件目录、链接库目录以及相关的链接库文件,而这本身opencv并不自带,需要自行通过利用cmake编译opencv源文件生成,而Cmake的编译又需要python的环境。

对于gdb对含opencv相关代码的可执行调试,需要gdb加载支持可执行文件中opencv相关功能的dll,这依然是通过利用cmake编译opencv源文件代码生成的。

3.MinGW、Python与CMake的下载与安装

MinGw的下载与安装不再做过多的阐述,具体参考我的,注意要点是x64版本且越新越好,推荐posix seh版本的,旧版本mingw可能会出现mingw32-make编译失败或gcc对编译失败的问题。

鉴于Python与CMake的下载和安装过于简单,此处亦不再做过多的阐释,注意要点是python只需达到2.8.0以上版本,CMake版本越新越好。

4.Opencv的下载与安装

笔者安装的是OpenCV 4.5.0版本,作此文时官网可查到的最新版本为4.4.0。建议下载最新版本,且推荐到github上官方opencv开发库下载发布的opencv套件资源,旧版本可能会出现编译生成链接库有略微差别(可自行调整g++编译命令配置)等问题

此处以安装opencv 4.5.0为例:将opencv文件解压到欲安装目录,并记住此安装目录。

5.利用Cmake对OpenCV源文件进行编译(重中之重)

1.打开Cmake;单击按钮“Browse Source...”,选择将对应之前opencv安装目录下的sources文件;单击按钮“Browse Build...”,选择opencv目录下build/x64目录,并新建一个MinGW的文件夹(用以存放编译生成的opencv文件)。

2.单击“Configure”按钮,此时会跳出让你选择编译器的窗口,请选择MinGW Makefiles模式,点击Specify native compilers选项,点击“Next”按钮。

3.重中之重之重中之重1:之后跳转到选择用以编译makefile相关文件的编译器,请务必选择MinGW安装目录下bin文件夹中的x86_64-w64-mingw32-gcc.exe与x86_64-w64-mingw32-g++.exe作为编译文件的编译器(若没有说明所下载的MinGW版本过低或非64位),点击“Finish”按钮。

经过一段配置时间,下面输出各种测试信息,在列表中生成了红色背景的各种配置项。

4.重中之重之重中之重2:在列表项中找到ENABLE_CXX11这一项,对其Value值进行勾选。在最新版本情况下大概率是没有的,此时需要我们自行添加这一项,点击“Add Entry”按钮,在Name一栏中输入ENABLE_CXX11,并在Value一栏中点击勾选,后单击“OK”按钮。此时可在列表栏第一项中找到自行添加的表项。

5.重中之重之重中之重3:在列表项中找到OPENCV_ENABLE_ALLOCATOR_STATS这一项,将Value值取消勾选。在最新版本情况下这一表项大概率是存在的,若没有可尝试自行添加,步骤如上,但不保证后面步骤的编译成功。

6.完成操作后,再次单击“Configure”按钮,此时会再次配置生成Cmakefile相关文件,比第一次生成速度快,且列表项背景由红变白。之后单击"Generate"按钮,完成Cmake对opencv的编译部分。

6.利用minGW32-make对生成的makefile相关文件进行编译和装载。

1.打开cmd,通过cd语句切换到opencv文件夹下build/x64/MinGW目录,若目录未发生跳转,请输入该目录对应磁盘盘符,如下:

2.输入minGW32-make命令对makefile相关文件进行编译,此时似乎会在MinGW(指编译器)所在文件夹中生成一些文件。此过程耗时最长,预计在30分钟左右,具体时间随电脑性能而波动,伴随着编译到100%而成功,若失败,请回滚到先前的操作反思问题。

3.编译成功后,输入minGW32-make install命令对编译文件进行装载

4.配置环境变量:将opencv所在文件夹下build/x64/MinGW/bin目录添加至系统变量Path中

7.修改vscode调试配置文件

可修改原cpp工作目录(连带其他非opencv相关代码在调试时编译速度会比以往慢一丢丢)或新建专用与opencv的工作目录,调整目录下.vscode文件夹中的相关配置,请根据以下配置作为参考修改自己的配置文件。

c_cpp_properties.json文件

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}",
                "D:/Install/opencv/build/include"   //将opencv所在目录的/build/include目录路径添加于此

            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "compilerPath": "D:/Install/MinGW/bin/g++.exe",
            "intelliSenseMode": "gcc-x64",
            "browse": {
                "path": [
                    "${workspaceFolder}"
                ],
                "limitSymbolsToIncludedHeaders": true,
                "databaseFilename": ""
            },
            "cStandard": "c11",
            "cppStandard": "c++17"
        }
    ],
    "version": 4
}

launch.json文件

{
    "version": "0.2.0",  
    "configurations": [  
        {  
            "name": "gdb build active file", // 配置名称,将会在启动配置的下拉菜单中显示
            "type": "cppdbg",       // 配置类型,这里只能为cppdbg
            "request": "launch",    // 请求配置类型,可以为launch(启动)或attach(附加)  
            "program": "${fileDirname}/${fileBasenameNoExtension}.exe",// 将要进行调试的程序的路径
            "args": [],             // 程序调试时传递给程序的命令行参数,一般设为空即可  
            "stopAtEntry": false,   // 设为true时程序将暂停在程序入口处,一般设置为false  
            "cwd": "${fileDirname}", // 调试程序时的工作目录,一般为${workspaceFolder}即代码所在目录  
            "environment": [],  
            "externalConsole": true, // 调试时是否显示控制台窗口,一般设置为true显示控制台  
            "MIMode": "gdb",  
            "miDebuggerPath": "D:/Install/MinGW/bin/gdb.exe", // miDebugger的路径,注意这里要与MinGw的路径对应  
            "preLaunchTask": "g++", // 调试会话开始前执行的任务,一般为编译程序,c++为g++, c为gcc  
            "setupCommands": [  
                {   
            "description": "Enable pretty-printing for gdb",  
                    "text": "-enable-pretty-printing",  
                    "ignoreFailures": true  
                }  
            ]  
        }  
    ]
}

tasks.json文件

{
    "version": "2.0.0",
    "command": "g++",
    "args": [
        "-g",
        "-std=c++17",
        "${file}",
        "-o",
        "${fileDirname}/${fileBasenameNoExtension}.exe",
        "-I","D:/Install/opencv/build/include",                 //此处输入opencv所在build/include文件夹,用于编译时导入对应库文件
        "-L","D:/Install/opencv/build/x64/MinGW/bin",           //此处输入opencv所在build/x64/MinGW/bin文件夹,用于编译时导入相应dll文件
        "-l","libopencv_calib3d450",                            //根据build/x64/MinGW/bin文件夹内dll文件名自行填入或修改下列配置
        "-llibopencv_core450",
        "-llibopencv_dnn450",
        "-llibopencv_features2d450",
        "-llibopencv_flann450",
        "-llibopencv_gapi450",
        "-llibopencv_highgui450",
        "-llibopencv_imgcodecs450",
        "-llibopencv_imgproc450",
        "-llibopencv_ml450",
        "-llibopencv_objdetect450",
        "-llibopencv_photo450",
        "-llibopencv_stitching450",
        "-llibopencv_video450",
        "-llibopencv_videoio450"
        ],    // 编译命令参数

    "problemMatcher": {
        "owner": "cpp",
        "fileLocation": ["relative", "${fileDirname}"],
        "pattern": {
            "regexp": "^(.*):(/d+):(/d+):/s+(warning|error):/s+(.*)$",
            "file": 1,
            "line": 2,
            "column": 3,
            "severity": 4,
            "message": 5
        }
    }
}

自此基于vscode的opencv环境配置完毕,可输入如下程序进行测试:

#include
using namespace cv;

int main(void)
{
    Mat srcImage = imread("D:/Work/Cpp/Test/1.jpg");    //载入指定路径的图像
    imshow("Test OpenCV", srcImage);                    //显示该图像

    waitKey(0);                                         //调用opencv的等待函数,等待用户输入

    return 0;
}

测试结果如图所示:

 8.常见问题与解决方案(不定时更新)

编号 问题描述 可能原因
1 cmake中Configure失败提示缺少python环境 python未安装
2 cmake中Configure其他失败 所选择的MinGW编译器不对
3 minGW32-make编译生成中提示代码错误 Cmake中未勾选ENABLE_CXX11选项,导致opencv中部分需要C++11特性的代码无法编译/编译器选择错误或版本过低/opencv版本过低
4 minGW32-make编译生成中提示no such file or directory Cmake中勾选了OPENCV_ENABLE_ALLOCATOR_STATS选项
5 minGW32-make编译生成中长时间卡进度 纯粹就是卡了,重新编译一次试试
6 vscode中include相关opencv库文件出现波浪线提示 vscode无法识别库文件,检查c_cpp_properties.json中includePath的库目录是否正确/或编译过程中由编译出错导致了文件丢失
7 vscode中F5调试输出编译器提示no such file or directory 编译过程出错导致的编译失败/配置文件tasks.json中编译命令行有问题
8 vscode中F5调试输出编译器提示无法找到XXX.dll 编译过程出错导致的编译失败/配置文件tasks.json中编译命令行有问题
9 vsocde中F5编译成功但gdb调试闪退 未成功配置环境变量/minGW32-make过程中导致的编译器改动出错(此处需要重装MinGW再重新编译)
10 vscode中可成功调试图像识别相关代码但调试视频功能相关代码调试闪退 opencv版本过低或cmake过程中出现了某些配置错误导致的minGW32-make编译出来的东西不全