3. 学习图形用户界面
多数情况下,我们需要使用图形界面来显示我们的图像结果,并与用户交互。OpenCV 提供了基本的用户界面,以便创建应用程序和原型,为了更好地理解用户图形界面的工作原理,我们将创建一个名为 PhotoTool 的小应用程序,我们还将学习滤镜和颜色转换。
本章将介绍以下主题:
3.1 技术要求
3.2 OpenCV 用户界面介绍
OpenCV 的用户界面是基础性的,提供了创建和管理软件开发的基本功能。这些功能都是原生的,并针对实时应用程序进行了优化。
OpenCV 提供两种用户界面选项:
- 基于原生用户界面的基本界面,适用于 Mac OS 的 cocoa 或 carbon,以及适用于 Linux 或 Windows 用户界面的 GTK,这些界面在编译 OpenCV 时被默认选择
- 基于 Qt 的跨平台的略微高级的界面,编译时需要手动启用
使用 Qt 支持的 OpenCV
如果需要编译支持 Qt 的 OpenCV,请阅读 编译 Qt 支持的 OpenCV。
3.3 OpenCV 的基本图形用户界面
新建一个项目,编写 main.cpp
:
#include <iostream>
#include <string>
#include <sstream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
int main() {
cv::Mat lena = cv::imread("lena.jpg");
if (lena.empty()) {
std::cout << "Could not read the image" << std::endl;
return -1;
}
cv::Mat photo = cv::imread("photo.jpg");
if (photo.empty()) {
std::cout << "Could not read the image" << std::endl;
return -1;
}
cv::namedWindow("Lena", cv::WINDOW_NORMAL);
cv::namedWindow("Photo", cv::WINDOW_AUTOSIZE);
cv::moveWindow("Lena", 10, 10);
cv::moveWindow("Photo", 520, 10);
cv::imshow("Lena", lena);
cv::imshow("Photo", photo);
cv::resizeWindow("Lena", 512, 512);
cv::waitKey(0);
cv::destroyWindow("Lena");
cv::destroyWindow("Photo");
for (int i = 0; i < 10; i++) {
std::ostringstream ss;
ss << "Photo" << i;
cv::namedWindow(ss.str(), cv::WINDOW_NORMAL);
cv::moveWindow(ss.str(), 20 * i, 20 * i);
cv::imshow(ss.str(), photo);
}
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
配置 CMakeLists.txt
:
cmake_minimum_required(VERSION 3.10)
project(Photo_Tool)
set(CMAKE_CXX_STANDARD 17)
find_package(OpenCV REQUIRED)
message(STATUS "OpenCV version: ${OpenCV_VERSION}")
include_directories(${OpenCV_INCLUDE_DIRS})
link_directories(${OpenCV_LIB_DIR})
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
编译运行:
mkdir -p build
cd build
cmake ..
make -j $(nproc)
cd ..
./build/Photo_Tool
Windows 调试指南
如果你正在使用 Visual Studio 调试您的程序,可以使用 VS 内置的 CMake 功能来调试。如果您希望使用 MSVC 来编译,并使用命令行的 CMake 来调试,可以尝试下面的命令:
# CMake 配置
cmake -B ./build -G "Visual Studio 16 2019" -T host=x64 -A x64 .
# 编译命令
cmake --build ./build --config Release --target ALL_BUILD -j 4 --
# 执行
.\build\Release\Photo_Tool.exe
按任意键,出现:
将滑块和鼠标事件添加到界面
使用滑块和鼠标事件可以让我们直接与界面交互,改变图像或变量的属性。
我们下面实现一个功能:鼠标可以绘制绿色圆圈,使用滑块进行模糊处理。