[资源]OpenCV-MinGW编译资源及手动编译方法

前言

我在我的项目中使用到了OpenCV,但我的项目的编译器是MinGW,而官方在Windows环境下仅提供MSVC编译的版本,于是我只能去社区中找找有没有预编译版本。可惜的是,OpenCV_MingW仓库中只有OpenCV4.11.0的MinGW预编译版本,但它使用MinGW版本是8.10和13.1.0,比我的(15.2.0)旧,并且即使我降低自己的MinGW版本到13.1.0,我的代码仍然无法使用这个仓库中的预编译好的dll文件,提示无法找到OpenCV的dll的程序入口点。OpenCV-MinGW-Build和其他仓库则只有更旧版本的OpenCV。没办法,我只好选择自己编译。

OpenCV预编译文件下载

我使用Github Actions创建了一个每天凌晨4点(北京时间)自动检测新版本并编译OpenCV的仓库,我已经验证它能满足我的要求:Github Releases

具体的编译配置与下面的手动编译方法中的配置是一样的。

手动编译方法

[1]

下面我编译出来的文件也上传到了Github了。

前置准备

  • Git
  • MinGW(并配置好环境变量)
  • CMake
  • 可靠的网络连接

操作流程

拉取OpenCV源码

  1. 创建一个空文件夹作为OpenCV源码的存放目录,比如我使用D:\temp\opencv\sources

  2. 打开命令行终端,将工作目录切换到上一步的文件夹。
    我这里使用:

    C:\Users\Administrator>D:

    D:\>cd temp\opencv\sources

    D:\temp\opencv\sources>
  3. 使用git clone https://github.com/opencv/opencv.git命令拉取OpenCV的源代码。如果因网络问题拉取不成功的,可选择使用代理。

    要使Git使用代理,请在命令行中输入如下两条命令(我的代理运行在7897端口)。

    git config --global http.proxy "http://127.0.0.1:7897"
    git config --global https.proxy "https://127.0.0.1:7897"

    如果不再需要让Git使用代理,则在命令行输入如下两条命令。

    git config --global --unset http.proxy
    git config --global --unset https.proxy

    我的操作步骤如下:

    D:\temp\opencv\sources>git config --global http.proxy "http://127.0.0.1:7897"

    D:\temp\opencv\sources>git config --global https.proxy "https://127.0.0.1:7897"

    D:\temp\opencv\sources>git clone https://github.com/opencv/opencv.git
    Cloning into 'opencv'...
    remote: Enumerating objects: 348939, done.
    remote: Counting objects: 100% (27/27), done.
    remote: Compressing objects: 100% (15/15), done.
    remote: Total 348939 (delta 12), reused 12 (delta 12), pack-reused 348912 (from 2)
    Receiving objects: 100% (348939/348939), 537.20 MiB | 12.55 MiB/s, done.
    Resolving deltas: 100% (243645/243645), done.
    Updating files: 100% (7661/7661), done.

    D:\temp\opencv\sources>git config --global --unset http.proxy

    D:\temp\opencv\sources>git config --global --unset https.proxy

    D:\temp\opencv\sources>

创建CMake编译配置

  1. 安装了CMake之后,你应该会有一个叫cmake-gui.exe的程序(位于CMake安装位置下的bin文件夹)。启动这个程序。程序界面如下:

    CMake-GUI程序界面
  2. 创建一个文件夹作为OpenCV的编译输出目录。比如我选择D:\temp\opencv\build

  3. CMake程序中,在Where is the source code处填入源码路径。我的是D:\temp\opencv\sources\opencv。然后在Where to build the binaries处填入刚才创建的编译输出目录文件夹。我的是D:\temp\opencv\build。填写完毕后点击窗口左下角的Configure按钮。
    界面如下:

    CMake-GUI初次配置

  4. 当上一步完成之后,会弹出如下窗口。请在Specify the generator for this project处选择MinGW Makefiles,并在下方选择Specify native compilers,然后点击Next按钮。

    CMake-GUI弹出窗口1

  5. 选择编译器。直接在对应语言的框中填入你的编译器路径即可。一般编译器在MinGW的安装目录内的bin文件夹内。填入之后,点击Finish按钮。

    选择编译器

  6. 刚才的弹出式窗口会关闭,此时会开始加载一段时间,需要耐心等待一下(因为需要下载文件)。

    加载中

  7. 加载结束后请检查窗口底部的输出部分,寻找到对应的红字部分,如果有Download failed的字样,就看它的上几行,找到下载失败的内容(我这里是opencv_videoio_ffmpeg.dll)。


    去编译输出目录文件夹中找到CMakeDownloadLog.txt(我这里的完整路径是D:\temp\opencv\build\CMakeDownloadLog.txt),根据下载失败的内容,在CMakeDownloadLog.txt中查找到类似的行,比如这样:

    #do_copy "opencv_videoio_ffmpeg.dll" "2821ea672a11147a70974d760a54e9bc" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/ea9240e39bc0d6a69d2b1f0ba4513bdc7612a41e/ffmpeg/opencv_videoio_ffmpeg.dll" "D:/temp/opencv/build/3rdparty/ffmpeg"
    #missing "D:/temp/opencv/build/3rdparty/ffmpeg/opencv_videoio_ffmpeg.dll"

    手动下载这些下载失败的文件,并根据如上两行的内容指引放在相应的位置。比如我在这里需要手动访问https://raw.githubusercontent.com/opencv/opencv_3rdparty/ea9240e39bc0d6a69d2b1f0ba4513bdc7612a41e/ffmpeg/opencv_videoio_ffmpeg.dll下载文件,然后把下载的文件名改成opencv_videoio_ffmpeg.dll,然后复制到D:/temp/opencv/build/3rdparty/ffmpeg文件夹中。

    注意,下载失败的文件可能不止一个!请找到每个下载失败的文件并手动下载!

  8. 在如图所示的位置找到以下列出的条目并做相应的修改,完成后点击左下角的Configure,等待一段时间,如果加载完成后没有再出现下载失败的提示(如果上一步把所有下载失败的文件都手动下载好并放到对应目录下的话,这次应该不会再出现下载失败的提示了。如果仍然存在下载失败的文件,请重新做一遍第7步),则点击Generate按钮。

    CMake-GUI条目


    条目 修改 解释
    BUILD_EXAMPLES 勾选上 Build all examples
    BUILD_opencv_world 勾选上 Include opencv_world module into the OpenCV build
    CPU_DISPATCH 清空里面的值 Specify list of dispatched CPU optimizations
    WITH_OPENGL 勾选上 Include OpenGL support

  9. 当窗口底部出现Generating done的字样时,说明CMake编译配置已经生成完毕。此时就可以关闭CMake的窗口了。

    CMake-GUI配置完成

编译OpenCV

  1. 在编译输出目录处打开终端,输入mingw32-make -j 20即可开始编译。其中-j选项指定编译的线程数量,后面的20则是具体分配的线程数量。


  2. 编译完毕后使用mingw32-make install获得编译好的文件。输出如下:

    D:\temp\opencv\build>mingw32-make install
    [ 0%] Built target opencv_dnn_plugins
    [ 0%] Built target opencv_highgui_plugins
    [ 1%] Built target jpeg12-static
    ......
    [100%] Built target example_directx_d3d9_interop
    [100%] Built target example_directx_d3d9ex_interop
    [100%] Built target example_opengl_opengl
    Install the project...
    -- Install configuration: "Release"
    -- Installing: D:/temp/opencv/build/install/etc/licenses/dlpack-LICENSE
    -- Installing: D:/temp/opencv/build/install/etc/licenses/flatbuffers-LICENSE.txt
    ......
    -- Installing: D:/temp/opencv/build/install/x64/mingw/samples/directx/example_directx_d3d9_interop.exe
    -- Installing: D:/temp/opencv/build/install/x64/mingw/samples/directx/example_directx_d3d9ex_interop.exe
    -- Installing: D:/temp/opencv/build/install/x64/mingw/samples/opengl/example_opengl_opengl.exe

    D:\temp\opencv\build>

    现在你应该就能在编译输出文件夹中的install文件夹内找到编译好的dll等文件了。(我的是D:\temp\opencv\build\install

参考

  1. ^https://zeeklog.com/windowsshang-vscodezhong-pei-zhi-mingw-c-he-shou-dong-zi-bian-yi-an-zhuang-opencv-xiang-xi-tu-wen-jiao-cheng-3/
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇