全网与本博客内容相关的工作很多,只要可以解决问题,选用哪一种方法都好,最重要的环节是软件版本和系统环境。
Qt Creator 5.12.9 | Opencv 4.9.0 | mingW 8.1.0 seh | CMake 3.29.1 |
Opencv 3.4.16 | mingW 7.3.0 sjlj |
目录
1. 问题源头
正常的 Opencv 库可能与 Qt5 MinGW 工具集不兼容,导致报错如下:
2. 解决方案
MSVC:Qt5 只兼容MSVC的2015、2017版本,本机的VS是2019版本,而 Qt6 可以兼容更高版本的MSVC,本人未尝试安装。
MinGW:Qt5 MSVC可以正常使用 Opencv 库,而Qt5 MinGW 大多数情况下,需要使用 CMake 编译 Opencv-MinGW 库。
本博客为了解决上述问题,尝试编译 Opencv-MinGW 库。
(1)官网中下载 Opencv 4.9.0、mingW 8.1.0 seh、CMake 3.29.1,并配置环境变量如下:
(2)使用 CMake 进行编译,步骤如下:
a. 选择你的 Opencv 库的路径和需要建立的 Opencv-MinGW 路径。
b. 输入关键词 “world”,选择 Value。
c. 输入关键词 “python”,取消 Value。
d. 点击 “Add Entry” 添加项。
e. 依次点击 Configue 配置项目、Generate 生成项目。
f. 依次操作:打开 CMD,cd “build-mingw 路径”,输入命令——
minGW32-make -j 6
mingGW32-make install
其中,-j 6 代表使用几个线程进行编译,配置成功后的文件夹如下:
g. 完成 Opencv-MinGW 编译之后,配置 Qt5 项目中的环境如下:
3. 成果展示
解决上述问题后,运行车牌识别工程项目,界面展示结果如下:
4. 知识扩展
4.1 MinGW和MSVC的区别
MinGW(Minimalist GNU for Windows)和 MSVC(Microsoft Visual C++)是在 Windows 平台上用于 C 和 C++ 编程的两种不同的开发工具集。MSVC可以更好地与 Windows 平台集成,MinGW更注重开源性、跨平台性和自由度。
4.2 MinGW 的 sjlj 和 seh 版本的区别
(1)sjlj(Setjmp / Longjmp)
sjlj 是一种比较简单的异常处理机制,它使用了类似于 C 语言中的 setjmp() 和 longjmp() 函数来实现异常处理。sjlj 版本的 MinGW 它通常会比较慢,因为它需要保存和恢复函数的调用栈信息。
(2)seh(Structured Exception Handling)
seh 是 Windows 平台上的官方异常处理机制,由操作系统提供支持。seh 版本的 MinGW 利用了 Windows 的 seh 机制来处理异常,这种方式更加高效和稳定。
总的来说,seh 版本的 MinGW 在 Windows 平台上可能会表现更好,特别是当与 Windows API 或其他 Windows 特定的功能交互时。
>>> 如有疑问,欢迎评论区一起探讨。