@TOC
<math xmlns="http://www.w3.org/1998/Math/MathML"> O . 总述 : 如有疑问可留言沟通交流 O. 总述:^{如有疑问可留言沟通交流} </math>O.总述:如有疑问可留言沟通交流
给定源代码,通过 cmake 和 mingw 完成编译:
- cmake 用于在 目标文件夹 生成
Makefiles
等配置文件。 - mingw 根据
Makefiles
等配置文件进行源代码的编译。
本文所涉及的文件目录:
标题 所在位置 cmake D:\vscode\cmake-3.27.3\ mingw D:\vscode\mingw64-posix-seh\ opencv源代码文件夹 D:\OpenCV4.8.0\opencv\sources\ opencv编译文件夹 D:\OpenCV4.8.0\bin\
<math xmlns="http://www.w3.org/1998/Math/MathML"> Ⅰ . 下载安装 : 如有疑问可留言沟通交流 Ⅰ. 下载安装:^{如有疑问可留言沟通交流} </math>Ⅰ.下载安装:如有疑问可留言沟通交流
$Ⅰ.1 获取 cmake
cmake 各版本下载地址:Download | CMake
版本 | 下载链接 | 说明 |
---|---|---|
Windows x64 Installer: | cmake-3.27.3-windows-x86_64.msi | 安装包,可针对性的选择属性,例如添加环境变量 |
Windows x64 ZIP | cmake-3.27.3-windows-x86_64.zip | 免安装,需自行添加环境变量 |
建议下载压缩包 Windows x64 ZIP
,解压、添加环境变量。
$Ⅰ.2 获取 mingw
MinGW 各版本下载地址:Downloads - MinGW-w64
MinGW-w64 - for 32 and 64 bit Windows:MinGW-w64 - for 32 and 64 bit Windows download
建议下载压缩包 x86_64-posix-seh
,解压、添加环境变量。
MinGW 各版本参数 (Version、Architecture、Threads、Exception) 说明
- Version:指的是 GCC 编译器的版本,我选择的是当前最新版本 8.1.0,一般建议选择最新的版本;
- Architecture:指的是电脑的系统类型,i686 表示的是 32 位的系统类型,x86_64 表示的是 64 位的系统类型;
- Threads:指的是线程模型,posix 或 win32
- POSIX(Portable Operating System Interface,可移植操作系统接口),是 UNIX 系统的一个 API 设计标准,很多类 UNIX 系统也在支持兼容这个标准,如 Linux 操作系统。如果在 Windows 下开发 Linux 应用程序,则选择 posix;
- Win32,是 Windows 系统下一个 API 设计标准,如果开发 Windows 平台下的应用程序,就需要选择 Win32;
- Exception:指的是异常处理模型。i686 系统架构有两种选择:dwarf 和 sjlj;x86_64 系统架构也有两种选择:seh 和 sjlj。
sjlj,seh,dwarf 三者的区别 :
在C++中有
try...throw...catch
,当它执行这种结构时,它需要保存现场还原现场,而 sjlj,seh,dwarf 正是实现这类过程的三种方式。
sjlj 全称是 SetJump / LongJump,前者设还原点,后者跳到还原点。可用于 32 位或者 64 位系统。
seh(Structured Exception Handling,结构化异常处理)是 Borland 公司的,微软买了其专利使用权,它利用了 FS 段寄存器,将还原点压入栈,收到异常时再弹出。相较而言,sjlj 是 C 标准库就有的东西,seh 在 2014 年前是有专利的,从性能上说 seh 比 sjlj 快。只用于64位系统。
dwarf 只支持32位系统 -- 没有永久的运行时间开销 -- 需要整个调用堆栈被启用,这意味着exception不能被抛出,例如Windows系统DLL。
综上所述:
【x86_64 64位】
1、seh 是新发明的,性能比较好,但不支持 32位。
2、而 sjlj 则是古老的。只用于64位系统。
3、sjlj 稳定性好,支持 32位和64位。
因此,x86_64 系统架构的推荐使用 seh 的异常处理模型。
【i686 32位】
1、dwarf 只支持 32 位,但是 dwarf 的性能要优于 sjlj。
2、sjlj 支持 32 位或64 位,
因此,i686 系统架构的推荐使用 dwarf 的异常处理模型。
$Ⅰ.3 获取 opencv
opencv 各版本下载地址:Tags · opencv/opencv
opencv-contrib 各版本下载地址:Tags · opencv/opencv_contrib
上面两个都可以,zip是源代码;exe里面包含已经编译好的vc版本和源代码。
建议下载压缩包Source code(zip)
,解压。
下载解压完事儿之后确认存在环境变量:
D:\vscode\mingw64-posix-seh\bin
D:\vscode\cmake-3.27.3\bin
<math xmlns="http://www.w3.org/1998/Math/MathML"> Ⅱ . 配置、编译 : 如有疑问可留言沟通交流 Ⅱ. 配置、编译:^{如有疑问可留言沟通交流} </math>Ⅱ.配置、编译:如有疑问可留言沟通交流
Ⅱ.1 配置编译项
Ⅱ.1.1 配置 - configure
选择 源代码文件夹
、生成二进制文件的编译文件夹
,并勾选 Advanced
复选框:
源代码文件夹
D:\OpenCV4.8.0\opencv\sources
编译文件夹
D:\OpenCV4.8.0\bin
指定 该项目的生成器 makefile 版本 为 MinGW Makefiles
(及其gcc、g++所处位置)。
gcc、g++所处位置
D:\vscode\mingw64-posix-seh\bin
CMake 配置 OpenCV 编译项 期间会出现多条红色标注的关键项 (注意这不是报错):
想知道这些标红的选项代表什么,可以查阅下表;刨根问底 可以参考文章:
选项命名规范
用于控制依赖库的选项有三种,分别有不同的前缀:
BUILD_
:是否启用与 OpenCV 捆绑的第三方库的构建与使用HAVE_
:表明此依赖是否被启用,当自动检测无法使用时,可以用于手动启用一个依赖WITH_
:是否启用(enable or disable)此依赖当一个
WITH_
选项被 启用 时,有:
- 如果 相应的
BUILD_
选项也被启用,第三方库被构建并启用 => 相应的HAVE_
选项值会被设置为ON
- 如果 相应的
BUILD_
选项被禁用,会检测第三方库,如果第三方库被找到则被启用 => 如果找到了依赖则相应的HAVE_
选项值会被设置为ON
里面有几条常用的选项:
选项 描述 WITH_CUDA
异构计算,对 CUDA 的支持(默认未勾选:未启用此依赖);类似的其他选项: WITH_CUFFT
,WITH_CUBLAS
,WITH_NVCUVID
WITH_OPENCL
异构计算,对 OpenCL 的支持(默认已勾选);其他选项: WITH_OPENCL_SVM
、WITH_OPENCLAMDFFT
、WITH_OPENCLAMDBLAS
、WITH_OPENCL_D3D11_NV
、WITH_VA_INTEL
WITH_JASPER
图像读写,对 JPEG2000 with JasPer 的支持(默认已勾选) WITH_JPEG
图像读写,对 JPEG 的支持(默认已勾选) WITH_OPENJPEG
图像读写,对 JPEG2000 with OpenJPEG 的支持(默认已勾选) WITH_PNG
图像读写,对 PNG 的支持(默认已勾选) WITH_TIFF
图像读写,对 TIFF 的支持(默认已勾选) WITH_WEBP
图像读写,对 WEBP 的支持(默认已勾选) WITH_OPENEXR
图像读写,对 EXR 的支持(默认勾选) WITH_IMGCODEC_HDR
图像读写,对 HDR 的支持(默认已勾选) WITH_IMGCODEC_PXM
,WITH_IMGCODEC_PFM
图像读写,对 PPM, PGM, PBM, PFM 的支持(默认已勾选) WITH_IMGCODEC_SUNRASTER
图像读写,对 Sun Raster 的支持(默认已勾选) WITH_GDAL
图像读写,GDAL 集成(默认未勾选)GDAL 是一个更高级别的库,支持读取多种文件格式,包括 PNG、JPEG 和 TIFF。 WITH_GDCM
图像读写,GDCM 集成(默认未勾选) 通过 GDCM 库启用 DICOM 医学图像格式支持。 VIDEOIO_ENABLE_PLUGINS
图像读写,插件支持(默认已勾选)从 CV 4.1.0 版本开始,一些 videoio 后端可以构建为插件,从而打破对第三方库的严格依赖,并使它们在运行时成为可选项。 VIDEOIO_PLUGIN_LIST
图像读写,插件列表(默认为空)要编译为插件的后端名称的列表,使用逗号或分号分隔。支持的名称有 ffmpeg 、gstreamer 、msmf 、mfx 和 all。 WITH_AVFOUNDATION
视频读写,AVFoundation(Apple:默认已勾选)AVFoundation 框架是 Apple 平台的一部分,可用于从相机捕获帧、编码和解码视频文件。 WITH_MSMF
,WITH_MSMF_DXVA
视频读写,Microsoft Media Foundation(Windows:默认未勾选) Windows 的内置媒体基础框架(Windows' built-in Media Foundation framework)的后端,可用于从相机捕获帧,解码和编码视频文件。 WITH_MSMF_DXVA
启用硬件加速处理支持WITH_DSHOW
视频读写,DirectShow(Windows:默认已勾选)此后端使用较旧的 DirectShow 框架,只能用于从相机捕获帧。 WITH_V4L
视频读写,Video4Linux(Linux:默认已勾选)使用 Video4Linux API 从相机捕获图像。 WITH_FFMPEG
视频读写,FFmpeg(默认已勾选)与 FFmpeg 库集成,用于解码和编码视频文件和网络流。 WITH_GSTREAMER
视频读写,GStreamer(默认已勾选)启用与 GStreamer 库的集成,用于解码和编码视频文件、从摄像机和网络流中捕获帧。 WITH_1394
视频读写(默认已勾选)使用 DC1394 库对 IIDC IEEE1394 的支持。 WITH_OPENNI
视频读写(默认未勾选)OpenNI 可用于从深度感应相机捕获数据。已弃用。 WITH_OPENNI2
视频读写(默认未勾选)OpenNI2 可用于从深度感应相机捕获数据。 WITH_PVAPI
视频读写(默认未勾选)PVAPI 是用于 Prosilica GigE 相机的旧版 SDK。已弃用。 WITH_ARAVIS
视频读写,Aravis 库(默认未勾选)用于使用 Genicam 相机进行视频采集。 WITH_XIMEA
视频读写(默认未勾选)对 XIMEA 相机的支持。 WITH_XINE
视频读写(默认未勾选)对 XINE 库的支持。 WITH_LIBREALSENSE
视频读写(默认未勾选)对 RealSense 摄像头的支持。 WITH_MFX
视频读写,MediaSDK 库(默认未勾选)可用于原始视频流的硬件加速解码和编码。 WITH_GPHOTO2
视频读写,GPhoto 库(默认未勾选)可用于从相机中捕获帧。 WITH_ANDROID_MEDIANDK
视频读写,MediaNDK 库(默认未勾选)自 API level 21 起,可在 Android 上使用。 WITH_PTHREADS_PF
并行处理,pthreads(类 Unix:默认已勾选)基于 pthreads 库的默认后端可在 Linux、Android 和其他类 Unix 平台上使用。线程池在 OpenCV 中实现,可以通过环境变量 OPENCV_THREAD_POOL_*
进行控制。详细信息请参考modules/core/src/parallel_impl.cpp
文件中的源代码。WITH_TBB
并行处理,TBB(默认未勾选)Threading Building Blocks 是一个用于并行编程的跨平台库。 WITH_OPENMP
并行处理,OpenMP(默认未勾选)OpenMP API 依赖于编译器支持,适合多核计算。 WITH_HPX
并行处理,HPX(默认未勾选)High Performance ParallelX 是一个实验性后端,更适合多处理器环境。 PARALLEL_ENABLE_PLUGINS
并行处理,插件支持(默认已勾选)从 CV 4.5.2 版本开始支持动态加载线程后端。 目前仅支持单独的编译过程:首先必须使用一些默认的并行后端(例如 pthreads)构建 OpenCV,然后构建每个插件并将生成的二进制文件复制到 lib 或 bin 文件夹。 WITH_GTK
GUI 后端,GTK(Linux:默认已勾选)GTK 是 Linux 和类 Unix 操作系统中的常用工具包。 默认情况下如果找到版本 3 将使用它,可以使用 WITH_GTK_2_X
选项来强制使用版本 2。WITH_WIN32UI
GUI 后端,WinAPI(Windows:默认已勾选)WinAPI 是 Windows 中的标准 GUI API。 - GUI 后端,Cocoa(macOS:默认已勾选)Cocoa 是 macOS 中使用的框架。 WITH_QT
GUI 后端,qt(默认未勾选)Qt 是一个跨平台的 GUI 框架。 WITH_OPENGL
GUI 后端,OpenGL 集成(默认未勾选)可用于与 GTK、WIN32 和 Qt
后端一起绘制硬件加速窗口。HIGHGUI_ENABLE_PLUGINS
GUI 后端,插件支持(默认已勾选)从 CV 4.5.3 版本开始,GTK 后端可以被构建为动态加载的插件。 HIGHGUI_PLUGIN_LIST
GUI 后端,插件列表(默认为空) 要编译为插件的后端名称列表,用逗号或分号分隔。 支持的名称有 gtk 、gtk2 、gtk3 和 all。 BUILD_PROTOBUF
推理模块,protobuf 库(默认已勾选)构建自己的 protobuf 库副本。如果要使用外部库则必须禁用此选项。 WITH_PROTOBUF
推理模块,protobuf 库(默认已勾选)OpenCV 可以构建自己的库副本或使用外部库。dnn 模块需要此依赖项,如果找不到则 dnn 模块将被禁用。 PROTOBUF_UPDATE_FILES
推理模块(默认未勾选)重新生成所有 .proto
文件。必须安装与使用的 protobuf 版本兼容的 protoc 编译器。OPENCV_DNN_OPENCL
推理模块(默认已勾选)启用内置的 OpenCL 推断后端。 WITH_INF_ENGINE
推理模块,自 OpenVINO 2022.1 起已弃用 。启用英特尔推断引擎 (Intel Inference Engine, IE)后端。允许以 IE 格式 ( .xml
+.bin
)来运行网络。推断引擎必须作为 OpenVINO toolkit 的一部分安装,或者作为从源代码构建的独立库安装。INF_ENGINE_RELEASE
推理模块(默认为 2020040000
) 自 OpenVINO 2022.1 起已弃用。定义与 OpenVINO 工具包版本绑定的推断引擎库版本。必须是 10 位的字符串,例如 2020040000 对应于 OpenVINO 2020.4。WITH_NGRAPH
推理模块,自 OpenVINO 2022.1 起已弃用。启用对英特尔 NGraph 库的支持。该库是推断引擎后端的一部分,它允许运行从 OpenCV 支持的多种格式的文件中读取的任意网络:Caffe、TensorFlow、PyTorch、Darknet 等。必须安装 NGraph 库,它包含在推断引擎中。 WITH_OPENVINO
推理模块(默认未勾选)对英特尔 OpenVINO Toolkit 的支持。从 OpenVINO>=2022.1 起应该使用此选项而不是 WITH_INF_ENGINE
和WITH_NGRAPH
。OPENCV_DNN_CUDA
推理模块,CUDA 后端(默认未勾选)。前置条件是必须安装 CUDA、CUBLAS 和 CUDNN。 WITH_HALIDE
推理模块(默认未勾选)实验性的 Halide 后端,它可以在运行时为 dnn 层生成优化的代码。前置条件是必须安装 Halide。 WITH_VULKAN
推理模块(默认未勾选)实验性 Vulkan 后端。不需要附加依赖项,但可以使用外部 Vulkan 头文件( VULKAN_INCLUDE_DIRS
)。WITH_TENGINE
推理模块(默认未勾选)为 ARM CPU 启用实验性 Tengine 后端。前置条件是必须安装 Tengine 库。
可以根据自己的需求进行勾选,这里添加勾选:WITH_OPENGL
,再次点击configure。
注:如果opencv之后会在 qt 里面用到则需要添加勾选 WITH_QT
。
这次对余下的几条 红色标注项 进行核查(特别是路径),确认无误后点击configure。
Ⅱ.1.2 配置 - generate
直到没有红色标注项,点击 generate 生成 MinGW makefile。
在编译文件夹
可以看到编译所需的源代码和 Makefile 文件,关闭 cmake 软件。
源代码文件夹
D:\OpenCV4.8.0\opencv\sources
编译文件夹
D:\OpenCV4.8.0\bin
Ⅱ.2 编译、安装
打开任务管理器 - 性能 - CPU,右键 CPU活动 图窗 - 将图形更改为
- 逻辑处理器
确认 逻辑处理器
个数为 4 ,这个数字在后面需要用到
在 编译文件夹
下打开命令行窗口:
源代码文件夹
D:\OpenCV4.8.0\opencv\sources
编译文件夹
D:\OpenCV4.8.0\bin
Shift + 右键
-在此处打开 Powershell 窗口
输入指令
mingw32-make -j 4
注:指令中的
4
是刚刚在任务管理器中确认的逻辑处理器
个数。
回车,开始漫长的编译过程,预计耗时 30min ~ 90min ,这个要看电脑性能了。
编译完成之后,输入指令 mingw32-make install
install 完事之后 添加 D:\OpenCV4.8.0\bin\bin
至环境变量:
注 这个路径是 mingw 编译生成的二进制文件夹下的 bin 文件夹:
至此,Windows系统下 CMake + mingw 编译 OpenCV 源代码就完事了。
<math xmlns="http://www.w3.org/1998/Math/MathML"> Ⅲ . v s c o d e 配置项 : 如有疑问可留言沟通交流 Ⅲ. vscode 配置项:^{如有疑问可留言沟通交流} </math>Ⅲ.vscode配置项:如有疑问可留言沟通交流
- 打开
VSCode
,在插件管理搜索对应的插件:C/C++
,确认该插件已安装且启用:
- 下面是vscode里面关于opencv的配置项:
创建三个配置文件(c_cpp_properties.json
、launch.json
以及tasks.json
)和一个cpp文件,配置文件(*.json
)应当位于工作目录下的.vscode文件夹中:
编写
c_cpp_properties.json
文件:
c_cpp_properties.json{ "configurations": [ { "name": "win", "includePath": [ "${workspaceFolder}/**", /*此处修改为 include 对应的路径*/ "D:/vscode/mingw64-posix-seh/include", "D:/OpenCV4.8.0/bin/install/include", "D:/OpenCV4.8.0/bin/install/include/opencv2" ], "defines": [ "_DEBUG", "UNICODE", "_UNICODE" ], /*此处修改为本机 gcc 编译器所在的对应路径*/ "compilerPath": "D:/vscode/mingw64-posix-seh/bin/gcc.exe", "cStandard": "c11", "cppStandard": "c++17", "intelliSenseMode": "clang-x64" } ], "version": 4 }
编写
launch.json
文件:
launch.json{ "version": "0.2.0", "configurations": [ { "name": "Opencv4.8.0 debug", // 配置名称,将会在启动配置的下拉菜单中显示 "type": "cppdbg", // 配置类型,这里只能为 cppdbg "request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加) "program": "${fileDirname}/${fileBasenameNoExtension}.exe", // 将要进行调试的程序的路径 "args": [], // 程序调试时传递给程序的命令行参数,一般设为空即可 "stopAtEntry": false, // 设为true时程序将暂停在程序入口处,一般设置为false "cwd": "${workspaceFolder}", // 调试程序时的工作目录,一般为 ${workspaceRoot} 即代码所在目录,根据自身情况设定为 ${fileDirname} "environment": [], "externalConsole": false, // 调试时是否显示控制台窗口,设置为true时会弹出控制台出来,这个随意 "MIMode": "gdb", /*此处修改*/ "miDebuggerPath": "D:/vscode/mingw64-posix-seh/bin/gdb.exe", // miDebugger的路径,注意这里要与 MinGw 的路径对应 "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": false } ], "preLaunchTask": "opencv4.8.0 compile task" // 需要与 tasks.json 中的`label`字段保持一致 } ] }
编写
tasks.json
文件:
tasks.json{ // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ { "type": "shell", "label": "opencv4.8.0 compile task", /*此处修改*/ "command": "D:/vscode/mingw64-posix-seh/bin/g++.exe", "args": [ "-g", "-std=c++11", "${file}", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe", /*注意:此处导入的路径为编译后的 opencv 路径,请勿导入原始的 opencv 路径*/ "-I", "D:/OpenCV4.8.0/bin/install/include/", "-I", "D:/OpenCV4.8.0/bin/install/include/opencv2/", "-L", "D:/OpenCV4.8.0/bin/install/x64/mingw/bin/lib*" ],// 编译命令参数 "options": { /*此处修改*/ "cwd": "D:/vscode/mingw64-posix-seh/bin" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "presentation": { "panel": "new", //这里shared表示共享,改成new之后每个进程创建新的端口 } } ] }
新建
main.cpp
文件,同时准备一张图片:
main.cpp#include <iostream> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; int main(void) { // 注意替换 图片的路径 cv::Mat img = cv::imread("./earth.png"); cv::imshow("img", img); cv::waitKey(0); return 0; }
四个文件创建完成之后点击 main.cpp
点击右上角 run
,选择 Opencv4.8.0 debug
: 这个是和 launch.json
文件中的 name
字段一致的。
wow ~ success !
<math xmlns="http://www.w3.org/1998/Math/MathML"> Ⅳ . 潜在问 题 如有疑问可留言沟通交流 Ⅳ. 潜在问题^{如有疑问可留言沟通交流} </math>Ⅳ.潜在问题如有疑问可留言沟通交流
- Q1. 提示 error 'once_flag' in namespace 'std' does not name a type
A1: MinWg64 版本拥有两种线程类型: win32 and posix 。如果你当前安装的是 win32, 或许可以尝试替换为 "posix".
index
- Q2. win10 vscode opencv时运行出现 fatal error: opencv2/opencv.hpp: No such file or directory
A2: 出现该提示是由于 点击 run 之后选错了启动项 (应当选
launch.json
文件中name
字段一致的启动项)?opencv的bin路径是否添加到系统环境变量且重启电脑? 三个配置文件未放到 .vscode 文件夹中?配置文件里面的路径有问题?...
- Q3. VS code:代码出现蓝色波浪线,提示显示 xxxx: Unknown word.cSpell
A3: 安装了拼写检查插件(比如Code Spell Checker),但波浪线标注的单词来自外部的库、未被扩展识别,可以尝试右键 - spelling - Add Words to Workspace Settings。或者干脆直接禁用、卸载相应的扩展即可...
- Q4. 如何在 vscode 可以使用 opencv ?
- Q5. ...
A5: ...
<math xmlns="http://www.w3.org/1998/Math/MathML"> Ⅴ . 友情链 接 如有疑问可留言沟通交流 Ⅴ. 友情链接^{如有疑问可留言沟通交流} </math>Ⅴ.友情链接如有疑问可留言沟通交流
代码调试不易,转载请标明出处!
如果感觉本文对您有帮助,请留下您的赞,您的支持是我坚持写作分享的最大动力,谢谢!
References
0. OpenCV - github
1. MinGW-w64 - for 32 and 64 bit Windows
2. Download | CMake
3. Release OpenCV 4.8.0 · opencv/opencv
4. gcc/g++/MingW/MSVC与make/CMake的关系
5. mingw不同版本全解析_mingw版本
6. c++ - mingw32-make ERROR, error: 'once_flag' in namespace 'std' does not name a type - Stack Overflow
7. Windows + VSCode 配置 OpenCV C++ 一站式开发调试环境
8.VS code:代码出现蓝色波浪线,提示显示 xxxx: Unknown word.cSpell
可以肯定的是学海无涯,这篇文章也会随着对 vscode 的深入学习而持续更新,
欢迎各位在评论区留言进行探讨交流。