Windows平台使用CMake+MinGW64编译OpenCV

news/2024/10/1 9:41:52

Windows平台使用CMake+MinGW64编译OpenCV

(注:2年前写的笔记, 可能有些地方过时了)

目录
  • Windows平台使用CMake+MinGW64编译OpenCV
  • 1.安装及配置环境
    • 1.1 MinGW-w64
    • 1.2 CMake
    • 1.3 OpenCV源码
  • 2.CMake配置及生成
    • 2.1 新建目录
    • 2.2 CMake-GUI
    • 2.3 编译配置
    • 2.4 生成
    • 2.5 Make编译和安装
  • 3.配置CMake编译环境
    • 3.1 CMAKE_PREFIX_PATH配置
    • 3.2 在CMake中引用
    • 3.3 dll动态链接引用
        • 方法一: 加入PATH环境变量
        • 方法二: 直接复制.dll到当前可执行文件所在文件夹
  • 4.测试例程
    • 4.1 代码
    • 4.2 CMake配置和编译
      • 4.2.1 配置
        • 编译报错:找不到OpenCV
      • 4.2.2 编译
      • 4.2.3 运行
        • 运行报错:找不到dll

1.安装及配置环境

1.1 MinGW-w64

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

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

MinGW安装

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

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

D:\xxx\x86_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

完成后文件夹内容如下:

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文件夹

CMake配置1

点击Configure进行配置,弹出的窗口中下拉选择MinGW Makefiles,单选框直接选择Use default native compilers,如果前面配置OK的话,CMake应该可以自动检测到编译器所在位置的

CMake默认编译器

如果CMake在Configure过程中报找不到编译器的错误,可以选择第二个单选框Specify native compilers手动选择编译器路径

CMake手动选择编译器

2.3 编译配置

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

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

其中,ENABLE_PRECOMPILED_HEADERSWITH_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的工程都将引用该库
    1. 优点: 简单, 只需配置一次即可
  2. 在配置工程时指定OpenCV的路径,
    1. 优点: 不同的工程可以灵活指定不同的OpenCV库

3.1 CMAKE_PREFIX_PATH配置

这里我们仅介绍配置CMAKE_PREFIX_PATH环境变量的方法, 来使得CMake可以查找倒OpenCV库:

  1. 打开windows环境变量设置界面(此电脑右键-属性-高级系统设置-环境变量)
  2. 找到环境变量CMAKE_PREFIX_PATH, 找不到则新建
  3. 将安装目录下的x64\mingw\lib加入到环境变量CMAKE_PREFIX_PATH
    1. 这里我的安装路径是F:\Project\OpenCV_Src\install
    2. 我的环境是x64, 编译器是mingw
    3. 因此最终要设置到环境变量中的值为:F:\Project\OpenCV_Src\install\x64\mingw\lib;
    4. 注:这里最后带个分号可以使系统识别为列表, 方便添加其他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\x64\mingw\bin

因此有两种方法:

方法一: 加入PATH环境变量

  1. 点击PATH环境变量, 然后点编辑, 再点新建
  2. 将上述bin路径加入到PATH环境变量中
  3. 注意不要动到其他路径, 否则系统可能会出问题

方法二: 直接复制.dll到当前可执行文件所在文件夹

  1. 找到正确的bin文件夹, 也就是上述.dll所在文件夹
  2. 将所需的.dll文件复制到可执行文件(.exe)同目录下
  3. 更建议此方法, 反正要将该程序发给别人的话, 也得打包.dll文件, 否则别人也会报此错误

4.测试例程

4.1 代码

在任意位置新建一空文件夹作为测试用的工程, 并编写main.cppCMakeLists.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文件夹

例程CMakeGUI配置1

点击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: opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_gapi;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio
include path: F:/Project/OpenCV_Src/install/include
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

如果弹出如下错误:

运行报错1

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

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

  • libopencv_imgproc454.dll
  • libopencv_core454.dll
  • libopencv_highgui454.dll
  • libopencv_imgcodecs454.dll

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/29650.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

[转帖]TLAB(Thread Local Allocation Buffer)

https://www.cnblogs.com/Chary/p/18034613 TLAB是虚拟机在堆内存的eden划分出来的一块专用空间,是线程专属的。在虚拟机的TLAB功能启动的情况下,在线程初始化时,虚拟机会为每个线程分配一块TLAB空间,只给当前线程使用,这样每个线程都单独拥有一个空间,如果需要分配内存,…

K8s必须掌握的7个调试技巧

K8s必须掌握的7个调试技巧 原创 艾叔编程 艾叔编程 2024-05-09 09:35 北京 听全文Kubernetes(K8s)调试技术是指在使用Kubernetes集群过程中,用于定位和解决问题的方法和技术。Kubernetes是一个复杂的系统,它负责管理容器化的应用程序,确保它们按照预期运行。当应用程序出现…

联芯集成电路产品与方案

联芯集成电路产品与方案 逻辑制程解决方案 逻辑 / 混合信号 / 射频技术是数字电视、蓝牙、Wi-Fi、图像处理器,射频收发器等众多应用中最常用的晶圆专工解决方案。联电为不同的数据处理、混合信号及射频组件技术建立了广泛的跨代技术,也同时为建立专业技术平台奠定了坚实的基础…

Golang:deepcopy深拷贝工具库

Golang:deepcopy深拷贝工具库 原创 吃个大西瓜 Coding Big Tree 2024-05-02 08:30 云南 听全文Deep copy things译文:事物的深度复制文档github https://github.com/mohae/deepcopy pkg.go https://pkg.go.dev/github.com/mohae/deepcopy安装 go get github.com/mohae/deepco…

C++ 引用

引用函数的形参还有引用传参这一形式 引用:是一个变量的别名,它是某个已经存在的变量的另一个名字。 引用创建后,不可更改 因不可更改,所以必须初始化 必须初始化,所以不可为空(不能被修改) 语法:引用传参语法:函数三种传参模式对比

第十届山东省大学生程序设计竞赛题解(A、F、M、C)

部分代码define了long long,请记得开long long A. Calandar 把年份、月份、单个的天数全都乘以对应的系数转化成单个的天数即可,注意最后的结果有可能是负数,要转化成正数。发现技巧是:(ans % 5 + 5) % 5。? 还有注意不能这样写,答案不正确。或许是因为取模运算没有这样的…

定时将系统时间更新在日志文件中

获取当前系统时间,把时间转换为特定格式”yy年mm月dd日 星期x tt:mm:ss”,并每隔1s写入到本地磁盘中一个叫做log.txt的文本中,如果文本不存在则创建V1.0 2024年5月9日 发布于博客园实现:设计程序,获取当前系统时间,把时间转换为特定格式”yy年mm月dd日 星期x tt:mm:ss”,…