一、准备软件

我们本次用到的3个软件,(建议读者文件版本 尽量都和我相同,这样不容易出错。不同的也可以先自己试一下,不着急换)

MinGw:版本:8.1.0-release-posix-seh-rt_v6-rev0

Cmake:版本:3.18.4

Opencv:版本:3.4.5

根据不同的opencv版本最好使用对应的cmake工具,首先,打开OpenCV-MinGW-Build,找到对应的Releases版本。这里以OpenCV-4.5.2-x64 | zip | tar.gz为例,我们点击下拉键Configuration:

  • CMake-3.18.4【一定要下载对应的版本,否则大概率会编译失败】
下载时有条件的建议搭梯子,负责下行速度很慢。

二.下载软件

1、MinGw下载
https://sourceforge.net/projects/mingw-w64/files/

下载该文件,下载后解压,然后记住位置。添加环境变量,可以直接 win+Q 搜索 “环境变量”
然后在环境变量中,找到 path 
添加环境变量。然后 ctrl+R ,输入cmd,调出 cmd命令窗口。
输入: gcc -v

显示这样,就说明MinGw安装配置完成。

2、 Cmake下载
https://cmake.org/files/v3.18/

可以根据自己的需要下载对应版本的cmake工具。下载完后,和刚才的过程一样,解压生成一个文件夹。我们继续添加环境变量。然后,然后 ctrl+R ,输入cmd,调出 cmd命令窗口。
输入: cmake -version

然后我们的第二个软件也安装配置完成了。

3、Opencv下载
https://opencv.org/releases/

在这里找到自己需要的对应的opencv版本。下载后,安装。(指定目录,后期要用)
然后3个软件都下载安装配置完成了。
 

三、编译

这里我使用的是vscode,但是vscode没办法直接使用opencv,我们需要把opencv的源文件进行编译,然后才能使用。这也是我们要用到cmake的原因。下面我们要使用cmake编译opencv的源文件。

1、cmake-gui
找到cmake文件夹下的bin里的cmake-gui 文件,启动。

Where is the source code: 这里使用opencv目录下的source目录

Where to build the binaries: 这里是编译后的文件的放置目录
一般教程都放到opencv/build/x64/mingw
(注:这里的mingw是由我们自己创建的空文件夹)。

然后点击configure,下面对着我的配置一步一步来就好

这里意思是选择c 和 cpp 文件的编译工具,c我们用gcc.exe.cpp我们用g++.exe。
路径就是MinGw/bin/ 下的
继续 finish,会开始下载我们需要的东西。一些文件什么的。

然后程序会开始自动生成Makefiles等文件配置,需要一段时间请耐心等待。结束之后点击generate,然后再耐心等待一段时间(中间可能会报一些错误,大概原因是无法下载这个文件造成的,所以最好搭上梯子,然后结合自己问题搜一下应该是可以解决的)

完成之后是这样的

这里configure是大概率是会有问题的,只要在configure的过程中出现报红报错,那肯定是有问题的,大概率是因为网络问题无法下载一些配置文件,这个时候就需要用到科学上网,我们手动去下载配置这些文件,configure不论是否成功会生成一个CMakeDownloadLog.txt这个东西,里面会有我们需要手动下载的东西,https://www.cnblogs.com/huluwa508/p/10142718.html

上面的链接中就详细说明了我们如何从 CMakeDownloadLog.txt中获取我们所需要的配置文件的下载地址已经存放路径,把我们所需要的配置文件全部下载好并且放在指定路径之后继续configure,

就一直configure一直到没有任何问题就好,然后在执行完后,把关于python的都给取消勾选。勾选BUILD_opencv_world,WITH_OPENGL和BUILD_EXAMPLES,不勾选WITH_IPP、WITH_MSMF和ENABLE_PRECOMPILED_HEADERS(如果有的话),CPU_DISPATCH选空。
然后就可以generate了,全部完成之后会显示这样

然后我们就完成三分之一了

四,make 

配置好相关文件之后,下面就是make,开始对opencv进行编译了,ctrl+R,输入cmd进入命令行模式:
进入刚刚创建生成的mingw文件夹
执行命令: 

minGW32-make -j 4

这个过程会比较漫长并且痛苦,中途可能会因为某些不知名原因出错,比如(软件版本和我的不一样。那就试试和我一样的软件版本吧)其他的错误,建议百度,没有出错的话会一直编译到100%,那样就结束成功了。

没有出错的话,我们就继续在该目录输入命令:

minGW32-make install


这样会生成一个install目录。我们完成了最艰难的部分,我们终于编译完成!
然后我们继续添加两个环境变量:
第一个path是:/opencv/build/x64/vc15/bin
第二个path是:/opencv/build/x64/mingw/bin

五,配置vscode文件

这里需要我们来配置三个重要的文件,分别是launch.json文件,tasks.json文件和c_cpp_properties.json文件

这里我建议大家先去了解熟悉什么是动态链接库,静态链接库,然后了解一下上面这三个文件分别是干什么的,有什么作用,这样的话在修改配置文件的时候会有很大的帮助,大家可以参考下面的网站VS Code 配置调试参数、launch.json 配置文件属性、task.json 变量替换、自动保存并格式化、空格和制表符、函数调用关系、文件搜索和全局搜索、_vscode launch.json各项参数-CSDN博客

下面我会给出的我的三个文件的配置,大家仅供参考,结合自身情况进行修改

launch.json文件


{
    "version": "0.2.0",
    "configurations": [
    {
        "name": "(gdb) Launch", // 配置名称,将会在启动配置的下拉菜单中显示
        "type": "cppdbg", // 配置类型,cppdbg对应cpptools提供的调试功能;可以认为此处只能是cppdbg
        "request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加)
        "program": "${fileDirname}/${fileBasenameNoExtension}.exe", // 将要进行调试的程序的路径
        "args": [], // 程序调试时传递给程序的命令行参数,一般设为空即可
        "stopAtEntry": false, // 设为true时程序将暂停在程序入口处,相当于在main上打断点
        "cwd": "${workspaceFolder}", // 调试程序时的工作目录,此为工作区文件夹;改成${fileDirname}可变为文件所在目录
        "environment": [], // 环境变量
        "externalConsole": true, // 使用单独的cmd窗口,与其它IDE一致;为false时使用内置终端
        "internalConsoleOptions": "neverOpen", // 如果不设为neverOpen,调试时会跳到“调试控制台”选项卡,你应该不需要对gdb手动输命令吧?
        "MIMode": "gdb", // 指定连接的调试器,可以为gdb或lldb。
        "miDebuggerPath": "D:/x86_64-5.4.0-release-posix-seh-rt_v5-rev0/mingw64/bin/gdb.exe ", // 调试器路径,Windows下后缀不能省略,Linux下则不要
        "setupCommands": [
            { // 模板自带,好像可以更好地显示STL容器的内容,具体作用自行Google
                "description": "Enable pretty-printing for gdb",
                "text": "-enable-pretty-printing",
                "ignoreFailures": false
            }
        ],
        "preLaunchTask": "Compile" // 调试会话开始前执行的任务,一般为编译程序。与tasks.json的label相对应
    }]
}

tasks.json文件

// https://code.visualstudio.com/docs/editor/tasks
{
    "version": "2.0.0",
    "tasks": [
        {
        "label": "Compile", // 任务名称,与launch.json的preLaunchTask相对应
        "command": "D:/x86_64-5.4.0-release-posix-seh-rt_v5-rev0/mingw64/bin/g++.exe",   // 要使用的编译器,C++用g++
        "args": [
            "${file}",//当前文件名
            "-o",    // 指定输出文件名,不加该参数则默认输出a.exe,Linux下默认a.out
            "${fileDirname}/${fileBasenameNoExtension}.exe",
            "-g",    // 生成和调试有关的信息
            "-m64", // 不知为何有时会生成16位应用而无法运行,加上此条可强制生成64位的
            "-Wall", // 开启额外警告
            "-static-libgcc",     // 静态链接libgcc,一般都会加上
            "-finput-charset=UTF-8",
            "-fexec-charset=GBK", // 生成的程序使用GBK编码,不加这条会导致Win下输出中文乱码;繁体系统改成BIG5
            "-std=c++17", // 要用的语言标准,根据自己的需要修改。c++可用c++14
            // 扩展参数
            // -I 头文件目录
            // -L 库文件目录
            // -l 库文件
            "-I", "D:/OpenCV-MinGW-Build-OpenCV-3.4.1-x64/include",
            "-I", "D:/OpenCV-MinGW-Build-OpenCV-3.4.1-x64/include/opencv2",
            "-L", "D:/OpenCV-MinGW-Build-OpenCV-3.4.1-x64/x64/mingw/lib",
            "-l", "libopencv_calib3d341",
            "-l", "libopencv_core341",
            "-l", "libopencv_dnn341",
            "-l", "libopencv_features2d341",
            "-l", "libopencv_flann341",
            "-l", "libopencv_highgui341",
            "-l", "libopencv_imgcodecs341",
            "-l", "libopencv_imgproc341",
            "-l", "libopencv_ml341",
            "-l", "libopencv_objdetect341",
            "-l", "libopencv_photo341",
            "-l", "libopencv_stitching341",
            "-l", "libopencv_video341",
            "-l", "libopencv_videoio341",
            ], // 编译的命令,其实相当于VSC帮你在终端中输了这些东西
        "type": "process", // process是把预定义变量和转义解析后直接全部传给command;shell相当于先打开shell再输入命令,所以args还会经过shell再解析一遍
        "group": {
            "kind": "build",
            "isDefault": true // 不为true时ctrl shift B就要手动选择了
        },
        "presentation": {
            "echo": true,
            "reveal": "always", // 执行任务时是否跳转到终端面板,可以为always,silent,never。具体参见VSC的文档
            "focus": false,     // 设为true后可以使执行task时焦点聚集在终端,但对编译C/C++来说,设为true没有意义
            "panel": "shared"   // 不同的文件的编译信息共享一个终端面板
        },
        "problemMatcher":"$gcc" // 捕捉编译时终端里的报错信息到问题面板中,修改代码后需要重新编译才会再次触发
        // 本来有Lint,再开problemMatcher就有双重报错,但MinGW的Lint效果实在太差了;用Clang可以注释掉
    }]
}

c_cpp_properties.json文件

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "D:/OpenCV-MinGW-Build-OpenCV-3.4.1-x64/include",
                "D:/OpenCV-MinGW-Build-OpenCV-3.4.1-x64/include/opencv2"
    
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "compilerPath": "D:/x86_64-5.4.0-release-posix-seh-rt_v5-rev0/mingw64/bin/gcc.exe",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "clang-x64"
        }
    ],
    "version": 4
}

六.测试

以上文件配置完成之后,90%的工作已经完成了。下面我们只需要进行一下验证,如果验证没有什么太大的问题,那么恭喜你完成了vscode的opencv的c++配置。

下面是我给出的一个实列代码,用来使用opencv来打开本地的一张图片

#include <opencv2/opencv.hpp>
 
using namespace cv;
using namespace std;
int main()
{
	Mat img = imread("C:/Users/29737/Desktop/1.png");
	imshow("哈哈哈", img);
	waitKey(0);
 
	return 0;
}

备用方案

如果大家上面都试了但还是有问题的话,就是比如报错还是链接不到opencv的库,那么和有可能还是在cmake的时候出现了问题,这个时候我们可以启用备用方案,我们可以选择别人make好的opencv代码,这样的话就省得我们自己去花时间编译去修改错误,下面我给出了GitHub上开源的make的opencv源码,大家可以下载对应版本然后参考上文,就直接可以从配置opencv文件开始,省去了前面make的步骤

https://github.com/huihut/OpenCV-MinGW-Build?tab=readme-ov-file

这个是下载文件的目录,然后需要大家在进行环境变量的配置,如下图

然后就结合上面vscode的配置就可以

到此使用vscode来配置c++的opencv就完成了,过程是肯定会遇到错误的,这就需要大家有耐心,一步一步的发现问题,解决问题。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐