0.前言

OpenCV(开源计算机视觉库:http://opencv.org)是一个开源库,包含数百种计算机视觉算法。它本质上是一个 C++ API,而不是基于 C 的 OpenCV 1.x API(自 OpenCV 2.4 发布以来,C API已被弃用,并且没有使用C编译器进行测试)。由于在Windows系统上OpenCV官方对于Visual Studio这个IDE的编译支持较为完善,而使用GCC的话则比较麻烦。因此,笔者尝试在本文中探讨如何在Windows系统上使用MinGW-GCC编译OpenCV并在VSCode中引用进行开发。注意:在Windows系统上使用OpenCV进行开发时,笔者仍然强烈推荐使用Visual Studio。使用GCC配合编辑器来进行OpenCV编译和开发过于繁琐,体感上并不强于安装笨重的Visual Studio再使用OpenCV。

笔者使用的平台和相关工具:
Win11、MinGW-GCC(15.2.0)、CMake(4.1.0)、VSCode

1.下载OpenCV源码并用GCC编译

①环境准备和依赖安装:打开 MSYS2 UCRT64 终端,更新系统并安装必要的开发工具和依赖库:

# 更新系统
pacman -Syu
# 如果提示关闭终端,请关闭后重新打开MSYS2 UCRT64,再次运行:
pacman -Su

# 安装编译工具链
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain mingw-w64-ucrt-x86_64-cmake mingw-w64-ucrt-x86_64-ninja git

# 安装OpenCV核心依赖
pacman -S mingw-w64-ucrt-x86_64-gcc mingw-w64-ucrt-x86_64-eigen3 mingw-w64-ucrt-x86_64-openblas

# 安装GUI支持依赖 (GTK3)
pacman -S mingw-w64-ucrt-x86_64-gtk3

# 安装视频和图像编解码库
pacman -S mingw-w64-ucrt-x86_64-ffmpeg mingw-w64-ucrt-x86_64-libjpeg-turbo mingw-w64-ucrt-x86_64-libpng mingw-w64-ucrt-x86_64-libtiff mingw-w64-ucrt-x86_64-libwebp mingw-w64-ucrt-x86_64-openjpeg2

# 安装Fortran编译器(解决CMake配置错误)
pacman -S mingw-w64-ucrt-x86_64-gcc-fortran

# 安装解压工具(解压OpenCV源码)
pacman -S umzip

②下载OpenCV源代码,在 MSYS2 UCRT64 终端中执行:

# 进入家目录
cd ~

# 下载OpenCV 4.12.0 源代码
wget -O opencv-4.12.0.zip https://codeload.github.com/opencv/opencv/zip/refs/tags/4.12.0
unzip opencv-4.12.0.zip

# 下载OpenCV贡献模块源代码
wget -O opencv_contrib-4.12.0.zip https://codeload.github.com/opencv/opencv_contrib/zip/refs/tags/4.12.0
unzip opencv_contrib-4.12.0.zip

③编译与安装OpenCV:

#创建构建目录并进入:
mkdir -p ~/build-opencv-ucrt
cd ~/build-opencv-ucrt

#运行CMake进行配置:
cmake -G "Ninja" \
  -DCMAKE_BUILD_TYPE=RELEASE \
  -DCMAKE_INSTALL_PREFIX=/ucrt64 \
  -DBUILD_SHARED_LIBS=ON \
  -DOPENCV_EXTRA_MODULES_PATH=/home/$(whoami)/opencv_contrib-4.12.0/modules \
  -DWITH_GTK=ON \
  -DWITH_FFMPEG=ON \
  -DBUILD_EXAMPLES=OFF \
  -DBUILD_opencv_apps=OFF \
  ~/opencv-4.12.0
# 这一过程耗时较长

#开始编译(根据CPU核心数调整-j参数):
ninja -j$(nproc)
# 或指定核心数,例如:ninja -j8
# 这一过程耗时很长

#安装到系统目录:
ninja install

#验证安装:
# 检查库文件
ls /ucrt64/x64/mingw/lib/libopencv*
# 检查头文件
ls /ucrt64/include/opencv2/
# 检查版本
cat /ucrt64/include/opencv2/core/version.hpp | grep "CV_VERSION_"

2.创建VS Code项目并配置

①创建项目目录结构:

helloopencv/
├── .vscode/
│   ├── tasks.json
│   └── launch.json
├── src/
│   └── main.cpp
└── test_image.jpg (测试图片)

②输入测试代码 src/main.cpp

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    cv::Mat image = cv::imread("test_image.jpg");    // 从项目根目录读取图片
    if(image.empty()) {
        std::cout << "Could not open or find the image!" << std::endl;
        return -1;
    }
    cv::namedWindow("Hello OpenCV", cv::WINDOW_AUTOSIZE);
    cv::imshow("Hello OpenCV", image);
    cv::waitKey(0);
    cv::destroyAllWindows();
    std::cout << "OpenCV test completed successfully!" << std::endl;
    return 0;
}

③配置 tasks.json(用于编译):

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "Build Hello OpenCV (UCRT64)",
            "command": "D:/msys64/ucrt64/bin/g++.exe",    // 注意根据自己的 MSYS2 的安装位置进行修改
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "-std=c++17",
                "${workspaceFolder}/src/main.cpp",
                "-o", "${workspaceFolder}/build/helloopencv.exe",
                "-LD:/msys64/ucrt64/x64/mingw/lib",    // 注意根据自己的 MSYS2 的安装位置进行修改
                "-lopencv_core4120",
                "-lopencv_highgui4120",
                "-lopencv_imgcodecs4120",
                "-lopencv_imgproc4120",
                "-lopencv_videoio4120"
            ],
            "options": {
                "cwd": "${workspaceFolder}"    // 工作目录设置为项目根目录
            },
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": ["$gcc"]
        }
    ]
}

④配置launch.json(用于调试):

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch Hello OpenCV",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/helloopencv.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",    // 工作目录设置为项目根目录
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "D:/msys64/ucrt64/bin/gdb.exe",    // 注意根据自己的 MSYS2 的安装位置进行修改
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "Build Hello OpenCV (UCRT64)"    // 调试前先编译
        }
    ]
}

⑤将相关的DLL文件:libopencv_core4120.dlllibopencv_highgui4120.dlllibopencv_imgcodecs4120.dlllibopencv_imgproc4120.dlllibopencv_videoio4120.dllD:\msys64\ucrt64\x64\mingw\bin(动态链接库的库目录)路径复制到D:\projects\helloopencv\build(项目目录下的build文件夹,也就是.exe文件生成的位置),否则调试时会报错(因为找不到所需的DLL文件)。(这两个目录也要注意根据自己的 MSYS2 的安装位置和项目所在位置进行修改。
⑥之后摁F5,选择(gdb) Launch Hello OpenCV,就可以开始编译并调试了。

3.结语

现在我们已经成功实现在Windows系统上使用MinGW-GCC编译OpenCV并在VSCode中引用进行开发了。各位读者可以关注一下笔者的微信公众号:江澜的代码空间,在CSDN上发表的文章也会在上面同步发表,在微信公众号上还会不定期分享自己的随笔与生活感悟,谢谢~

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐