Windows下适用于MinGW的OpenCV编译安装以及在VSCode中的使用

内容目录

系统与软件版本

  • Windows 10 21H2 19044.2130
  • GNU version 12.2.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)
  • Cmake version 3.25.0-rc2
  • OpenCV version 4.6.0

安装前准备

  • 检查 MinGW 的安装版本是否为 posix 线程标准,目前 OpenCV 只支持 posix 标准,不支持 win32 标准
  • 安装Windows版本的 Cmake,官网链接为https://cmake.org/download/,一般选择 Windows x64 Installer 下载安装即可

下载与编译OpenCV源码

  1. 前往OpenCV官网下载 OpenCV 源代码,由于官网预编译好的只有vs15与vs14适用的版本,这里我们选择源码 Sources 进行下载(由于我使用的GCC版本为12.2.0,只有4.6.0版本的OpenCV支持);
    file

  2. 将下载好的源代码解压;

  3. 打开Cmake;
    file

  4. 选择解压后的opencv源码路径与编译二进制文件的路径,一般就选择源码路径下的build文件夹(Cmake会提醒创建,也可以自己提前创建),点击Configure
    file

  5. 选择MinGW Makefiles,如果对应的GNU编译器(包括gcc、g++、gfortran)已经在当前的环境变量PATH中,则可以选择默认的编译器,如下图所示;如果未添加进环境变量,可以选择Specify native compilers手动选择(不推荐,建议添加环境变量);
    file

  6. 等待Configure完成后,出现需要更新的红色的配置值,可以根据自己的需要进行适当调整,例如

    • 如果不需要Python与Java等,可以取消选择相关的选项 BUILD_opencv_python3BUILD_JAVA
    • 如果需要改变安装路径,可以修改 CMAKE_INSTALL_PREFIX,默认安装路径为 build/install
    • 如果希望将所有编译后的库文件整合为一个,可以开启 BUILD_opencv_world 选项,再次点击Configure
  7. 等待Configure完成后,点击Generate

  8. 在命令行中打开 build 目录,进行编译

    mingw32-make

    这一步需要较长时间,根据电脑性能不同可能从10分钟到2个小时不等,可以添加-j选项使用多线程编译加快速度(但不一定稳定);
    file

  9. 编译完成后,安装OpenCV,安装路径即为第6步中CMAKE_INSTALL_PREFIX的路径;

    mingw32-make install

    file

  10. 安装后的结果如下图所示;
    file

  11. 然后将 install/x64/mingw/bin 路径添加到环境变量PATH中;至此,OpenCV安装完成。
    file

OpenCV的使用以及在VSCode中的配置

  1. 创建一个测试文件 test_cv.cpp

    #include <opencv2/opencv.hpp>
    using namespace cv;
    
    int main() {
        Mat img = imread("F:/EasyCoding/Cpp/circuit.png");
        imshow("4K", img);
        waitKey(0);
        return 0;
    }
  2. 在命令行中使用 g++ 进行编译,需要-I指定头文件搜索路径、-L指定函数库搜索路径、-l链接函数库,因此,若要使用OpenCV编译C++文件,指令需如下所示(注意链接的函数后面的数字指代OpenCV版本,需要依据不同的版本进行更换);

    g++.exe -g .test_cv.cpp -o .test_cv.exe -I E:SDKopencv-4.6.0buildinstallinclude -L E:SDKopencv-4.6.0buildinstallx64minglib -l libopencv_calib3d460 -l libopencv_core460 -l libopencv_dnn460 -l libopencv_features2d460 -l libopencv_flann460 -l libopencv_gapi460 -l libopencv_highgui460 -l libopencv_imgcodecs460 -l libopencv_imgproc460 -l libopencv_ml460 -l libopencv_objdetect460 -l libopencv_photo460 -l libopencv_stitching460 -l libopencv_video460 -l libopencv_videoio460

    若在编译OpenCV的第六步中选择了 BUILD_opencv_world 选项,则可简化命令为

    g++ -g .test_cv.cpp -o .test_cv.exe -I E:SDKopencv-4.6.0buildinstallinclude -L E:SDKopencv-4.6.0buildinstallx64mingwlib -l libopencv_world460

    运行可执行程序结果如下图所示
    file

  3. 在VSCode中为OpenCV库的代码添加代码提示与函数跳转

    • 首先需要安装C/C++插件
    • 然后 {Ctrl}+{Shift}+{p} 打开命令面板,输入Edit Configurations,选择第一个
      file
    • 在包含路径一栏中添加include/**路径,最终的 c_cpp_properties.json 如下所示(仅供参考)
      {
      "configurations": [
          {
              "name": "Win32",
              "includePath": [
                  "${workspaceFolder}/**",
                  "E:/SDK/opencv-4.6.0/build/install/include/**"
              ],
              "defines": [
                  "_DEBUG",
                  "UNICODE",
                  "_UNICODE"
              ],
              "windowsSdkVersion": "10.0.22621.0",
              "compilerPath": "E:/SDK/MinGW/gnu_x64-12.2.0-posix-seh-rt_v10-rev0/bin/gcc.exe",
              "cStandard": "c17",
              "cppStandard": "c++17",
              "intelliSenseMode": "windows-gcc-x64"
          }
      ],
      "version": 4
      }
  4. 使用 C/C++ 插件编译依赖OpenCV库的程序时,我们无需修改 launch.json 文件,只需在 task.json 中如第2步所示添加编译选项,最终任务配置如下所示(仅供参考,注意labellaunch.json中的preLaunchTask一致)

    {
        "type": "shell",
        "label": "g++.exe build active file",
        "command": "E:/SDK/MinGW/gnu_x64-12.2.0-posix-seh-rt_v10-rev0/bin/g++.exe",
        "args": [
            "-g",
            "${file}",
            "-o",
            "${fileDirname}\${fileBasenameNoExtension}.exe",
            "-I", "E:/SDK/opencv-4.6.0/build/install/include",
            "-L", "E:/SDK/opencv-4.6.0/build/install/x64/mingw/lib",
            "-l", "libopencv_calib3d460",
            "-l", "libopencv_core460",
            "-l", "libopencv_dnn460",
            "-l", "libopencv_features2d460",
            "-l", "libopencv_flann460",
            "-l", "libopencv_gapi460",
            "-l", "libopencv_highgui460",
            "-l", "libopencv_imgcodecs460",
            "-l", "libopencv_imgproc460",
            "-l", "libopencv_ml460",
            "-l", "libopencv_objdetect460",
            "-l", "libopencv_photo460",
            "-l", "libopencv_stitching460",
            "-l", "libopencv_video460",
            "-l", "libopencv_videoio460",
        ],
        "options": {
            "cwd": "E:/SDK/MinGW/gnu_x64-12.2.0-posix-seh-rt_v10-rev0/bin"
        },
        "group": {
            "kind": "build",
            "isDefault": true
        }
    }

    若在编译OpenCV的第六步中选择了 BUILD_opencv_world 选项,则可简化配置为(仅供参考,注意labellaunch.json中的preLaunchTask一致)

    {
        "type": "shell",
        "label": "g++.exe build active file",
        "command": "E:/SDK/MinGW/gnu_x64-12.2.0-posix-seh-rt_v10-rev0/bin/g++.exe",
        "args": [
            "-g",
            "${file}",
            "-o",
            "${fileDirname}\${fileBasenameNoExtension}.exe",
            "-I", "E:/SDK/opencv-4.6.0/build/install/include",
            "-L", "E:/SDK/opencv-4.6.0/build/install/x64/mingw/lib",
            "-l", "libopencv_world460",
        ],
        "options": {
            "cwd": "E:/SDK/MinGW/gnu_x64-12.2.0-posix-seh-rt_v10-rev0/bin"
        },
        "group": {
            "kind": "build",
            "isDefault": true
        }
    }
  5. 使用 CodeRunner 插件编译依赖OpenCV库的程序,与第2步中相同,只需要在设置中code-runner.executorMap选项中cpp的部分中添加相关参数即可,这里不再赘述。