问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Windows平台使用CMake+MinGW64编译OpenCV

创作时间:
作者:
@小白创作中心

Windows平台使用CMake+MinGW64编译OpenCV

引用
1
来源
1.
https://www.cnblogs.com/tamapchn/p/18183405

本文将详细介绍在Windows平台上使用CMake和MinGW64编译OpenCV的完整过程。从环境配置到最终测试,每个步骤都经过精心设计,旨在帮助开发者快速掌握这一技术。

1. 安装及配置环境

1.1 MinGW-w64

编译器使用MinGW-w64:MinGW-w64 - for 32 and 64 bit Windows

注意:安装MinGW-w64时,选择posix接口的Threads,否则编译OpenCV时会一直报错(典型现象是前期会报找不到mutex的错误)

具体安装细节可以参考文章:MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本

将含有gcc.exe的bin文件夹配置环境变量PATH,如


D:\xxx\u0086_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin

测试,打开CMD,输入


gcc --version

另外,如果装有QT可以选择使用QT自带的编译器,也是可以进行编译的

1.2 CMake

下载:Download | CMake

安装中会询问是否将CMake添加到PATH环境变量,为了方便可以选择

Add CMake to the system PATH for all users

测试,打开CMD,输入


cmake --version

1.3 OpenCV源码

从GitHub下载OpenCV源码,进入网页https://github.com/opencv/opencv,点击

Code▼

Download ZIP

下载zip压缩包

如果有安装git,可以cd到合适的新目录下,然后直接使用

git clone https://github.com/opencv/opencv.git

命令下载源码

由于github下载较慢,这里fork了一份源码(2021-11-8)到gitee以供下载:https://gitee.com/chntamap/opencv

完成后文件夹内容如下:

2. CMake配置及生成

2.1 新建目录

在opencv文件夹外新建目录build和install,分别用于放生成文件及编译完成的文件

2.2 CMake-GUI

打开CMake(cmake-gui):

Where is the source code:

选择opencv源代码文件夹

Where to build thr binaries:

选择build文件夹

点击

Configure

进行配置,弹出的窗口中下拉选择

MinGW Makefiles

,单选框直接选择

Use default native compilers

,如果前面配置OK的话,CMake应该可以自动检测到编译器所在位置的

如果CMake在

Configure

过程中报找不到编译器的错误,可以选择第二个单选框

Specify native compilers

手动选择编译器路径

2.3 编译配置

编译配置参考了网上几篇文章,普遍配置为:


ENABLE_PRECOMPILED_HEADERS:不勾选
WITH_IPP:不勾选
WITH_OPENGL:勾选

其中,

ENABLE_PRECOMPILED_HEADERS

WITH_IPP

在这边的配置中默认没有勾选因此无需操作

其他文章普遍勾选了

ENABLE_CXX11

,但这边找不到相关配置,因此忽略这一项

如果有安装QT,可以选择勾选

WITH_QT

,目前环境没有安装QT,选择不勾选

**另外,

CMAKE_INSTALL_PREFIX

可以配置install路径**, 这里将其配置为了刚刚新建的install文件夹,这个文件夹将放置最终的编译结果

注:更建议使用opencv加版本号的形式替代install文件夹, 如opencv-4.5.4文件夹, 这样可以兼容不同版本的库, 这里为了方便, 直接使用install文件夹

其他的配置根据需要或碰到的问题,再进一步具体调整即可

2.4 生成

点击

Generate

,等待生成

这一步会下载相关的文件,由于网络环境的影响,可能会有部分文件下载失败报错(如

opencv_videoio_ffmpeg.dll

等)

下载失败的文件可在build目录的日志文件

CMakeDownloadLog.txt

查看,文件中写明了下载链接及需要放置的路径,自行找另外的方法下载

这里提供了部分自己下载的文件,取出需要的文件放置到build/3rdparty对应位置即可

3rdparty_win.zip-蓝奏云

完成后再次点击

Generate

2.5 Make编译和安装

打开cmd,使用cd命令进入build目录输入:


mingw32-make

如需要加速编译则输入


mingw32-make -j 8

其中

-j 8

参数用于加速编译,数量8根据CPU核心决定

编译完成后,输入命令完成最后的安装步骤:


mingw32-make install

如果配置了

CMAKE_INSTALL_PREFIX

, 那么OpenCV将会安装在指定的位置, 比如我这里设置了install文件夹, 记住install文件夹的位置, 后面调用该库时需要用到

此处没有对环境变量进行配置, 会导致编译时找不到源文件, 运行时也找不到动态链接库

先通过测试例程进行问题说明, 再针对问题配置环境

3. 配置CMake编译环境

编译好OpenCV库后, 如果没有配置环境, 则系统将找不到库导致编译报错和运行报错;

下面是两种配置方法, 各有优劣:

  1. 将OpenCV配置到系统环境变量中, 这样所有用到OpenCV的工程都将引用该库

  2. 优点: 简单, 只需配置一次即可

  3. 在配置工程时指定OpenCV的路径,

  4. 优点: 不同的工程可以灵活指定不同的OpenCV库

3.1 CMAKE_PREFIX_PATH配置

这里我们仅介绍配置

CMAKE_PREFIX_PATH

环境变量的方法, 来使得CMake可以查找倒OpenCV库:

  1. 打开windows环境变量设置界面(此电脑右键-属性-高级系统设置-环境变量)

  2. 找到环境变量

CMAKE_PREFIX_PATH

, 找不到则新建

  1. 将安装目录下的

x64\mingw\lib

加入到环境变量

CMAKE_PREFIX_PATH

  1. 这里我的安装路径是

F:\Project\OpenCV_Src\install

  1. 我的环境是x64, 编译器是mingw

  2. 因此最终要设置到环境变量中的值为:

F:\Project\OpenCV_Src\install\u0064\mingw\lib;

  1. 注:这里最后带个分号可以使系统识别为列表, 方便添加其他CMake库或其他版本的OpenCV库

3.2 在CMake中引用

要在工程中调用OpenCV, 则需要在CMakeLists.txt中加入以下两个语句, 分别用于查找和链接:


find_package(OpenCV REQUIRED)
target_link_libraries(opencv_example PRIVATE ${OpenCV_LIBS})

如果需要指定OpenCV的版本, 则可以加入版本号, 如:


find_package(OpenCV 4.5.4 REQUIRED)

3.3 dll动态链接引用

执行调用了opencv的应用程序时, 可能会因为引用了dll动态链接库, 但系统找不到文件而报错

动态链接库文件位于install目录下的

x64\mingw\bin

文件夹, 例如我的路径是:

F:\Project\OpenCV_Src\install\u0064\mingw\bin

因此有两种方法:

方法一: 加入PATH环境变量
  1. 点击PATH环境变量, 然后点编辑, 再点新建

  2. 将上述bin路径加入到PATH环境变量中

  3. 注意不要动到其他路径, 否则系统可能会出问题

方法二: 直接复制.dll到当前可执行文件所在文件夹
  1. 找到正确的bin文件夹, 也就是上述.dll所在文件夹

  2. 将所需的.dll文件复制到可执行文件(.exe)同目录下

  3. 更建议此方法, 反正要将该程序发给别人的话, 也得打包.dll文件, 否则别人也会报此错误

4. 测试例程

4.1 代码

在任意位置新建一空文件夹 (用英文路径,mingw不支持中文路径) 作为测试用的工程, 并编写

main.cpp

CMakeLists.txt

文件:

main.cpp: 显示一张纯蓝色的200*200的图片


#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
    cout << "Built with OpenCV " << CV_VERSION << endl;
    Mat img = Mat(200, 200, CV_8UC3, Scalar(255, 0, 0));
    imshow("Source", img);
    waitKey(0);
    return 0;
}

CMakeLists.txt: 将main.cpp加入工程; 然后查找并链接opencv库


# cmake needs this line
cmake_minimum_required(VERSION 3.1)
# Define project name
project(opencv_example_project)
# Find OpenCV, you may need to set OpenCV_DIR variable
# to the absolute path to the directory containing OpenCVConfig.cmake file
# via the command line or GUI
find_package(OpenCV REQUIRED)
# If the package has been found, several variables will
# be set, you can find the full list with descriptions
# in the OpenCVConfig.cmake file.
# Print some message showing some of them
message(STATUS "OpenCV library status:")
message(STATUS "    config: ${OpenCV_DIR}")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")
# Declare the executable target built from your sources
add_executable(opencv_example main.cpp)
# Link your application with OpenCV libraries
target_link_libraries(opencv_example PRIVATE ${OpenCV_LIBS})
# target_link_libraries(opencv_example PRIVATE strmiids)
# target_link_libraries(opencv_example PRIVATE quartz)

4.2 CMake配置和编译

4.2.1 配置

打开CMake GUI

源文件位置: 选择当前文件夹

编译位置: 选择当前文件夹下新建的build文件夹

点击Configure按钮, 在弹出的对话框中选择MinGW编译器, 操作与## 2.2 CMake-GUI相同, 可跳回去参考

点Finish, 将提示以下信息, 表示配置成功:

Found OpenCV: F:/Project/OpenCV_Src/install (found version "4.5.4")

OpenCV library status:

config: F:/Project/OpenCV_Src/install/x64/mingw/lib

version: 4.5.4

libraries: ...

Configuring done

和上述编译OpenCV源码的操作相似,

再点击Generate即可生成Makefile工程到build文件夹, 提示:

Generating done

编译报错:找不到OpenCV

报错信息如下:

CMake Error at CMakeLists.txt:10 (find_package):

By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project has

asked CMake to find a package configuration file provided by "OpenCV", but

CMake did not find one.

Could not find a package configuration file provided by "OpenCV" with any

of the following names:


OpenCVConfig.cmake
opencv-config.cmake

Add the installation prefix of "OpenCV" to CMAKE_PREFIX_PATH or set

"OpenCV_DIR" to a directory containing one of the above files. If "OpenCV"

provides a separate development package or SDK, be sure it has been

installed.

意思是找不到opencv, 需要我们在环境变量或配置中提供OpenCV库所在的位置, 参考## 3.1 CMAKE_PREFIX_PATH配置进行环境配置,并重启CMakeGUI以刷新程序的环境变量

4.2.2 编译

打开命令行工具, 并cd到build文件夹下, 然后执行make:

mingw32-make

, 输出如下:

F:\Project\OpenCV_Src\project\test\build>mingw32-make

[ 50%] Building CXX object CMakeFiles/opencv_example.dir/main.cpp.obj

[100%] Linking CXX executable opencv_example.exe

[100%] Built target opencv_example

表示编译成功

4.2.3 运行

随后在build文件夹中, 双击运行程序:

opencv_example.exe

如果操作无误, 则可以看到显示如下:

运行报错:找不到dll

如果弹出如下错误:

说明系统找不到.dll动态链接库文件, 参考:dll动态链接引用

运行exe, 看看是否还会报错, 将新报错的文件补上, 直到程序正常运行(或者简单粗暴一点, 将所有dll复制过去就完事), 针对例程程序的需要, 此处我复制了四个文件:

  • libopencv_imgproc454.dll

  • libopencv_core454.dll

  • libopencv_highgui454.dll

  • libopencv_imgcodecs454.dll

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号