diff --git a/QtOpenCVImageTool.zip b/QtOpenCVImageTool.zip new file mode 100644 index 0000000..78f45c5 Binary files /dev/null and b/QtOpenCVImageTool.zip differ diff --git a/build_windows.bat b/build_windows.bat new file mode 100644 index 0000000..9c13188 --- /dev/null +++ b/build_windows.bat @@ -0,0 +1,46 @@ +@echo off +setlocal + +rem Usage: +rem build_windows.bat C:\Qt\6.6.0\msvc2019_64 C:\opencv\build\x64\vc16\lib "Visual Studio 17 2022" +rem build_windows.bat C:\Qt\6.6.0\mingw_64 C:\opencv-mingw\install "MinGW Makefiles" + +if "%~1"=="" ( + echo Usage: %~nx0 ^ ^ [CMakeGenerator] + echo Example MSVC : %~nx0 C:\Qt\6.6.0\msvc2019_64 C:\opencv\build\x64\vc16\lib "Visual Studio 17 2022" + echo Example MinGW: %~nx0 C:\Qt\6.6.0\mingw_64 C:\opencv-mingw\install "MinGW Makefiles" + exit /b 1 +) + +if "%~2"=="" ( + echo Missing OpenCV_DIR. + exit /b 1 +) + +set QT_DIR=%~1 +set OPENCV_DIR=%~2 +set GENERATOR=%~3 + +if "%GENERATOR%"=="" ( + set GENERATOR=Visual Studio 17 2022 +) + +if not exist build-windows ( + mkdir build-windows +) + +if /I "%GENERATOR%"=="MinGW Makefiles" ( + cmake -S . -B build-windows -G "%GENERATOR%" -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="%QT_DIR%" -DOpenCV_DIR="%OPENCV_DIR%" +) else ( + cmake -S . -B build-windows -G "%GENERATOR%" -A x64 -DCMAKE_PREFIX_PATH="%QT_DIR%" -DOpenCV_DIR="%OPENCV_DIR%" +) + +if errorlevel 1 exit /b %errorlevel% + +cmake --build build-windows --config Release +if errorlevel 1 exit /b %errorlevel% + +echo. +echo Build finished. +echo For MSVC, check: build-windows\Release\QtOpenCVImageTool.exe +echo For MinGW, check: build-windows\QtOpenCVImageTool.exe diff --git a/build_wsl_windows.sh b/build_wsl_windows.sh new file mode 100755 index 0000000..eeca5db --- /dev/null +++ b/build_wsl_windows.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +set -euo pipefail + +if ! command -v x86_64-w64-mingw32-g++ >/dev/null 2>&1; then + echo "Missing x86_64-w64-mingw32-g++." + echo "Install it in WSL with: sudo apt install mingw-w64" + exit 1 +fi + +if [[ "${QT_MINGW_PREFIX:-}" == "" ]]; then + echo "Missing QT_MINGW_PREFIX." + echo "Example: export QT_MINGW_PREFIX=/opt/mxe/usr/x86_64-w64-mingw32.shared/qt6" + exit 1 +fi + +if [[ "${OpenCV_DIR:-}" == "" ]]; then + echo "Missing OpenCV_DIR." + echo "Example: export OpenCV_DIR=/opt/mxe/usr/x86_64-w64-mingw32.shared/lib/cmake/opencv4" + exit 1 +fi + +cmake -S . -B build-wsl-windows \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/mingw64.cmake \ + -DCMAKE_PREFIX_PATH="${QT_MINGW_PREFIX}" \ + -DOpenCV_DIR="${OpenCV_DIR}" + +cmake --build build-wsl-windows --config Release + +echo "Windows executable should be under build-wsl-windows/." diff --git a/cmake/toolchains/mingw64.cmake b/cmake/toolchains/mingw64.cmake new file mode 100644 index 0000000..0dcfb71 --- /dev/null +++ b/cmake/toolchains/mingw64.cmake @@ -0,0 +1,11 @@ +set(CMAKE_SYSTEM_NAME Windows) +set(CMAKE_SYSTEM_PROCESSOR x86_64) + +set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) +set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) +set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/readme.md b/readme.md index 40e3319..b549775 100644 --- a/readme.md +++ b/readme.md @@ -20,72 +20,219 @@ - 图像分类:根据平均亮度和主色通道给出简单分类,同时显示目标数量。 - 线程处理:图像处理工作对象运行在 `QThread` 中,避免阻塞界面。 -## Windows 编译运行 +## Windows 构建说明 -本工程用于构建 Windows 桌面应用程序。建议使用 Qt Creator 打开 `CMakeLists.txt` 构建,编译器可选择 MSVC 或 MinGW,但 Qt、OpenCV 和编译器位数必须一致,例如全部使用 64 位。 +本工程使用 CMake 管理,目标是构建 Windows 桌面应用程序 `QtOpenCVImageTool.exe`。推荐使用 **MSVC 64 位**,因为 OpenCV 官方 Windows 预编译包通常就是 MSVC 版本,配置最省事。 -### 环境准备 +构建时请保持三者一致: -1. 安装 Qt for Windows,推荐 Qt 6.x,并安装对应的 MinGW 64-bit 或 MSVC 64-bit 组件。 -2. 安装 OpenCV for Windows,或自行用相同编译器编译 OpenCV。 -3. 安装 CMake。Qt Creator 通常会自带可用的 CMake。 +- 编译器一致:MSVC 对 MSVC,MinGW 对 MinGW。 +- 位数一致:建议全部使用 64 位。 +- Qt、OpenCV、CMake 使用同一套构建环境。 -### Qt Creator 构建 +如果使用 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,例如 `Desktop Qt 6.x MinGW 64-bit` 或 `Desktop Qt 6.x MSVC 64-bit`。 -4. 如果 CMake 找不到 OpenCV,在 CMake 配置中加入: +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 ``` -实际路径以你的 OpenCV 安装目录为准。MinGW 自编译 OpenCV 时,应填写包含 `OpenCVConfig.cmake` 的目录。 +5. 配置完成后点击“构建”。 +6. 构建成功后会生成 `QtOpenCVImageTool.exe`。 +7. 在 Qt Creator 中点击“运行”即可启动程序。 -5. 点击“构建”并运行。 +### 命令行构建:MSVC -### 命令行构建示例 +打开开始菜单中的: -也可以直接使用项目提供的 `build_windows.bat`: - -```bat -build_windows.bat C:\Qt\6.6.0\mingw_64 C:\opencv\build "MinGW Makefiles" +```text +x64 Native Tools Command Prompt for VS 2022 ``` -或 MSVC: +进入工程目录,例如: + +```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" ``` -MinGW 示例: +如果你的 Qt 是 MSVC 2022 版本,路径可改为: ```bat -mkdir build -cd build -cmake .. -G "MinGW Makefiles" -DCMAKE_PREFIX_PATH=C:\Qt\6.6.0\mingw_64 -DOpenCV_DIR=C:\opencv\build -cmake --build . --config Release +build_windows.bat C:\Qt\6.6.0\msvc2022_64 C:\opencv\build\x64\vc16\lib "Visual Studio 17 2022" ``` -MSVC 示例: +也可以手动执行 CMake: ```bat -mkdir build -cd build +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 通常位于: -在 Windows 上运行生成的 `QtOpenCVImageTool.exe` 时,需要能找到 Qt 和 OpenCV 的 DLL。调试阶段可在 Qt Creator 中直接运行;发布时可使用: - -```bat -windeployqt QtOpenCVImageTool.exe +```text +build-windows\Release\QtOpenCVImageTool.exe ``` -然后把 OpenCV 的运行库 DLL 一并复制到 exe 所在目录,例如 `opencv_world*.dll` 或相关 `opencv_*.dll`。 +### 命令行构建: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。 ## WSL 中交叉编译 Windows 程序