Some checks failed
Build Windows Release / Windows x64 Release (MinGW + Qt + OpenCV) (push) Has been cancelled
298 lines
8.2 KiB
Markdown
298 lines
8.2 KiB
Markdown
# Qt + OpenCV 图像显示与处理
|
||
|
||
本工程使用 Qt Widgets 设计界面,使用 OpenCV 完成图像处理。程序支持打开图片、保存图片、另存图片,支持缩放、平移、旋转,并提供目标提取和简单图像分类功能。图像显示使用 Qt 的 `QLabel`/`QWidget`,没有使用 `cv::imshow`。
|
||
|
||
## 文件说明
|
||
|
||
- `CMakeLists.txt`:CMake 工程配置。
|
||
- `main.cpp`:程序入口。
|
||
- `MainWindow.h`:主窗口类和处理参数声明。
|
||
- `MainWindow.cpp`:界面、图像读写、Qt 线程和 OpenCV 处理实现。
|
||
|
||
## 功能
|
||
|
||
- 打开图片:读取 `png/jpg/bmp/tif` 等常见格式。
|
||
- 保存图片:保存当前处理结果。
|
||
- 另存图片:将处理结果保存为新文件。
|
||
- 显示对比:左侧显示处理前图像,右侧显示处理后图像。
|
||
- 基本处理:缩放、水平平移、垂直平移、旋转。
|
||
- 目标提取:使用灰度化、Otsu 阈值、形态学处理和轮廓检测提取前景目标,并用绿色矩形框标记目标。
|
||
- 图像分类:根据平均亮度和主色通道给出简单分类,同时显示目标数量。
|
||
- 线程处理:图像处理工作对象运行在 `QThread` 中,避免阻塞界面。
|
||
|
||
## Windows 构建说明
|
||
|
||
本工程使用 CMake 管理,目标是构建 Windows 桌面应用程序 `QtOpenCVImageTool.exe`。推荐使用 **MSVC 64 位**,因为 OpenCV 官方 Windows 预编译包通常就是 MSVC 版本,配置最省事。
|
||
|
||
构建时请保持三者一致:
|
||
|
||
- 编译器一致:MSVC 对 MSVC,MinGW 对 MinGW。
|
||
- 位数一致:建议全部使用 64 位。
|
||
- Qt、OpenCV、CMake 使用同一套构建环境。
|
||
|
||
如果使用 MSVC,则不要混用 MinGW 版 Qt;如果使用 MinGW,则不要直接使用 OpenCV 官方 MSVC 预编译包。
|
||
|
||
### 需要安装的软件
|
||
|
||
1. Visual Studio 2022 或 Visual Studio 2022 Build Tools
|
||
|
||
安装时勾选:
|
||
|
||
```text
|
||
Desktop development with C++
|
||
MSVC v143 x64/x86 build tools
|
||
Windows 10 SDK 或 Windows 11 SDK
|
||
C++ CMake tools for Windows
|
||
```
|
||
|
||
安装完成后,系统中应能找到类似路径:
|
||
|
||
```text
|
||
C:\Program Files\Microsoft Visual Studio\2022\Community
|
||
C:\Program Files\Microsoft Visual Studio\2022\BuildTools
|
||
```
|
||
|
||
2. Qt for Windows
|
||
|
||
使用 Qt Online Installer 安装 Qt。推荐安装 Qt 6.x,并勾选 MSVC 64 位组件,例如:
|
||
|
||
```text
|
||
Qt 6.6.x
|
||
MSVC 2019 64-bit 或 MSVC 2022 64-bit
|
||
Qt Creator
|
||
```
|
||
|
||
安装完成后,Qt 路径通常类似:
|
||
|
||
```text
|
||
C:\Qt\6.6.0\msvc2019_64
|
||
C:\Qt\6.6.0\msvc2022_64
|
||
```
|
||
|
||
该目录下应存在:
|
||
|
||
```text
|
||
C:\Qt\6.6.0\msvc2019_64\lib\cmake\Qt6\Qt6Config.cmake
|
||
```
|
||
|
||
3. OpenCV for Windows
|
||
|
||
可以使用 OpenCV 官方 Windows 包。解压或安装到例如:
|
||
|
||
```text
|
||
C:\opencv
|
||
```
|
||
|
||
常见的 CMake 配置路径是:
|
||
|
||
```text
|
||
C:\opencv\build\x64\vc16\lib
|
||
```
|
||
|
||
该目录下应存在:
|
||
|
||
```text
|
||
C:\opencv\build\x64\vc16\lib\OpenCVConfig.cmake
|
||
```
|
||
|
||
4. CMake
|
||
|
||
如果安装 Visual Studio 时勾选了 CMake 工具,通常已经够用。也可以单独安装 CMake for Windows。命令行检查:
|
||
|
||
```bat
|
||
cmake --version
|
||
```
|
||
|
||
### 推荐方式:Qt Creator 构建
|
||
|
||
1. 打开 Qt Creator。
|
||
2. 选择“打开项目”,打开本目录的 `CMakeLists.txt`。
|
||
3. 选择 Windows Kit,例如:
|
||
|
||
```text
|
||
Desktop Qt 6.x.x MSVC 2019 64-bit
|
||
Desktop Qt 6.x.x MSVC 2022 64-bit
|
||
```
|
||
|
||
4. 如果 CMake 找不到 OpenCV,在 Qt Creator 的 CMake 配置项中添加:
|
||
|
||
```text
|
||
OpenCV_DIR=C:/opencv/build/x64/vc16/lib
|
||
```
|
||
|
||
5. 配置完成后点击“构建”。
|
||
6. 构建成功后会生成 `QtOpenCVImageTool.exe`。
|
||
7. 在 Qt Creator 中点击“运行”即可启动程序。
|
||
|
||
### 命令行构建:MSVC
|
||
|
||
打开开始菜单中的:
|
||
|
||
```text
|
||
x64 Native Tools Command Prompt for VS 2022
|
||
```
|
||
|
||
进入工程目录,例如:
|
||
|
||
```bat
|
||
cd /d D:\QtOpenCVImageTool
|
||
```
|
||
|
||
使用项目提供的脚本构建:
|
||
|
||
```bat
|
||
build_windows.bat C:\Qt\6.6.0\msvc2019_64 C:\opencv\build\x64\vc16\lib "Visual Studio 17 2022"
|
||
```
|
||
|
||
如果你的 Qt 是 MSVC 2022 版本,路径可改为:
|
||
|
||
```bat
|
||
build_windows.bat C:\Qt\6.6.0\msvc2022_64 C:\opencv\build\x64\vc16\lib "Visual Studio 17 2022"
|
||
```
|
||
|
||
也可以手动执行 CMake:
|
||
|
||
```bat
|
||
mkdir build-windows
|
||
cd build-windows
|
||
cmake .. -G "Visual Studio 17 2022" -A x64 -DCMAKE_PREFIX_PATH=C:\Qt\6.6.0\msvc2019_64 -DOpenCV_DIR=C:\opencv\build\x64\vc16\lib
|
||
cmake --build . --config Release
|
||
```
|
||
|
||
MSVC 生成的 exe 通常位于:
|
||
|
||
```text
|
||
build-windows\Release\QtOpenCVImageTool.exe
|
||
```
|
||
|
||
### 命令行构建:MinGW
|
||
|
||
如果使用 MinGW,需要安装 MinGW 版 Qt,并准备 MinGW 编译出来的 OpenCV。不要把 MSVC 版 OpenCV 直接给 MinGW 使用。
|
||
|
||
示例:
|
||
|
||
```bat
|
||
build_windows.bat C:\Qt\6.6.0\mingw_64 C:\opencv-mingw\install "MinGW Makefiles"
|
||
```
|
||
|
||
手动构建:
|
||
|
||
```bat
|
||
mkdir build-windows
|
||
cd build-windows
|
||
cmake .. -G "MinGW Makefiles" -DCMAKE_PREFIX_PATH=C:\Qt\6.6.0\mingw_64 -DOpenCV_DIR=C:\opencv-mingw\install
|
||
cmake --build . --config Release
|
||
```
|
||
|
||
MinGW 生成的 exe 通常位于:
|
||
|
||
```text
|
||
build-windows\QtOpenCVImageTool.exe
|
||
```
|
||
|
||
### 运行和发布
|
||
|
||
构建出来的 `QtOpenCVImageTool.exe` 运行时需要 Qt 和 OpenCV 的 DLL。开发阶段可以直接在 Qt Creator 中运行;如果要单独拷贝给别人运行,需要把依赖 DLL 一起放到 exe 目录。
|
||
|
||
MSVC Release 示例:
|
||
|
||
```bat
|
||
cd build-windows\Release
|
||
C:\Qt\6.6.0\msvc2019_64\bin\windeployqt.exe QtOpenCVImageTool.exe
|
||
copy C:\opencv\build\x64\vc16\bin\opencv_world*.dll .
|
||
```
|
||
|
||
如果 OpenCV 不是 `opencv_world*.dll`,则复制对应的 `opencv_*.dll` 到 exe 所在目录。
|
||
|
||
MinGW 示例:
|
||
|
||
```bat
|
||
cd build-windows
|
||
C:\Qt\6.6.0\mingw_64\bin\windeployqt.exe QtOpenCVImageTool.exe
|
||
copy C:\opencv-mingw\bin\opencv_*.dll .
|
||
```
|
||
|
||
### 常见问题
|
||
|
||
1. `Could not find Qt6`
|
||
|
||
说明 `CMAKE_PREFIX_PATH` 没有指向 Qt 安装目录。请确认路径类似:
|
||
|
||
```text
|
||
C:\Qt\6.6.0\msvc2019_64
|
||
```
|
||
|
||
2. `Could not find OpenCV`
|
||
|
||
说明 `OpenCV_DIR` 没有指向包含 `OpenCVConfig.cmake` 的目录。请搜索 `OpenCVConfig.cmake`,并把它所在目录传给 CMake。
|
||
|
||
3. 程序启动时报缺少 DLL
|
||
|
||
请运行 `windeployqt`,并把 OpenCV 的 DLL 复制到 exe 所在目录。
|
||
|
||
4. 链接时报 MSVC/MinGW 相关错误
|
||
|
||
通常是 Qt、OpenCV、编译器不匹配。MSVC 工程必须使用 MSVC 版 Qt 和 MSVC 版 OpenCV;MinGW 工程必须使用 MinGW 版 Qt 和 MinGW 版 OpenCV。
|
||
|
||
## CI 自动构建和发布
|
||
|
||
仓库提供了 Gitea Actions 工作流:
|
||
|
||
```text
|
||
.gitea/workflows/build-windows-release.yml
|
||
```
|
||
|
||
触发方式:
|
||
|
||
- 推送到 `main` 分支。
|
||
- 推送 `v*` 标签,例如 `v1.0.0`。
|
||
- 在 Gitea 页面手动运行 `workflow_dispatch`。
|
||
|
||
CI 会在 Fedora 容器中安装 MinGW-w64、Qt6、OpenCV,交叉编译 Windows x64 程序,然后打包:
|
||
|
||
```text
|
||
QtOpenCVImageTool-windows-x64-<version>.zip
|
||
QtOpenCVImageTool-windows-x64-<version>.zip.sha256
|
||
```
|
||
|
||
最后通过 Gitea API 上传到仓库 Release。为了允许上传 Release,请在仓库的 Actions Secrets 中配置:
|
||
|
||
```text
|
||
RELEASE_TOKEN=<具有仓库 release 写权限的 token>
|
||
```
|
||
|
||
如果 Gitea 已经给 Actions 提供可写的 `GITHUB_TOKEN`,也可以不配置 `RELEASE_TOKEN`。
|
||
|
||
发布版本建议使用 tag:
|
||
|
||
```bash
|
||
git tag v1.0.0
|
||
git push origin v1.0.0
|
||
```
|
||
|
||
这样 Release 名称和包名会使用 `v1.0.0`。如果只是推送到 `main`,CI 会创建预发布版本,名称类似 `build-提交哈希`。
|
||
|
||
## WSL 中交叉编译 Windows 程序
|
||
|
||
WSL 里不能使用 Linux 版 Qt/OpenCV 直接生成 Windows exe,必须准备 Windows 目标库。推荐使用 MinGW-w64 作为交叉编译器,并准备同为 MinGW-w64 目标的 Qt 和 OpenCV。
|
||
|
||
需要的组件:
|
||
|
||
- `x86_64-w64-mingw32-g++`
|
||
- Windows/MinGW 目标 Qt,目录中应包含 `Qt6Config.cmake` 或 `Qt5Config.cmake`
|
||
- Windows/MinGW 目标 OpenCV,目录中应包含 `OpenCVConfig.cmake`
|
||
|
||
构建脚本:
|
||
|
||
```bash
|
||
export QT_MINGW_PREFIX=/opt/mxe/usr/x86_64-w64-mingw32.shared/qt6
|
||
export OpenCV_DIR=/opt/mxe/usr/x86_64-w64-mingw32.shared/lib/cmake/opencv4
|
||
./build_wsl_windows.sh
|
||
```
|
||
|
||
如果使用的是自己编译或复制来的 Windows 目标 Qt/OpenCV,把上面两个路径换成实际路径即可。
|
||
|
||
## 说明
|
||
|
||
本示例中的分类属于简单规则分类,适合作为课程作业演示:根据图像整体亮度判断“偏亮/偏暗/亮度适中”,根据 BGR 平均值判断主色。若需要更高精度分类,可替换为训练好的 OpenCV DNN 或传统机器学习模型。
|