OpenCV 图像处理与键盘交互

本文介绍如何使用 OpenCV 进行图像处理,并通过键盘事件来交互式地处理图像。从基础的图像加载开始,逐步介绍如何通过按键操作来实现图像的灰度转换、HSV转换、图像反转、图像加色偏移和模糊效果。

1. 准备工作

首先,你需要安装 OpenCV 库。如果你还没有安装 OpenCV,可以参考 OpenCV官网 上的教程来安装。

2. 基础图像加载

在 OpenCV 中,图像的加载使用 imread() 函数,返回一个 Mat 类型的对象。这里我们用 PicPath 变量存储图像路径,通过 imread() 加载图像:

cpp 复制代码
const std::string PicPath = "C:\\Users\\23213\\Pictures\\恐非太.jpg";
Mat image = imread(PicPath);

如果路径不正确或者图像文件不存在,imread() 会返回一个空的 Mat 对象。所以我们需要检查图像是否加载成功:

cpp 复制代码
if (image.empty()) {
    std::cout << "无法加载图像!" << std::endl;
    return -1;
}

3. 创建窗口并设置交互

OpenCV 提供了 namedWindow()resizeWindow() 函数来创建一个窗口并调整其大小。imshow() 函数用于在该窗口显示图像。

cs 复制代码
namedWindow("键盘响应", WINDOW_NORMAL);
resizeWindow("键盘响应", image.cols, image.rows);  // 设置窗口大小与图像一致

4. 键盘交互与图像处理

为了实现键盘交互,我们使用 waitKey() 函数,它会等待用户按下键并返回按键的 ASCII 值。我们将根据按键的值进行不同的图像处理操作。以下是我们设计的功能:

  • 1 键: 转换为灰度图像。

  • 2 键: 转换为 HSV 图像。

  • 3 键: 增加绿色偏移。

  • 4 键: 应用图像反转。

  • 5 键: 应用高斯模糊。

我们创建了一个 key_demo() 函数来监听按键并执行对应的图像处理操作:

cpp 复制代码
void key_demo(Mat& image) {
    dst = Mat::zeros(image.size(), image.type());
    while (true) {
        int c = waitKey(100);  // 等待100毫秒获取按键的ASCII值

        if (c == 27) {  // 按下Esc键,退出程序
            break;
        }

        if (c == 49) {  // Key#1: 转换为灰度图像
            std::cout << "你按下了 '1' 键,正在转换为灰度图像。" << std::endl;
            cvtColor(image, dst, COLOR_BGR2GRAY);  // 转换为灰度图
            imshow("键盘响应", dst);
            setWindowTitle("键盘响应", "灰度图像");
        }

        if (c == 50) {  // Key#2: 转换为HSV图像
            std::cout << "你按下了 '2' 键,正在转换为HSV图像。" << std::endl;
            cvtColor(image, dst, COLOR_BGR2HSV);  // 转换为HSV图
            imshow("键盘响应", dst);
            setWindowTitle("键盘响应", "HSV图像");
        }

        if (c == 51) {  // Key#3: 增加绿色偏移
            std::cout << "你按下了 '3' 键,正在增加绿色偏移。" << std::endl;
            dst = image + Scalar(0, 128, 0);  // 增加绿色偏移
            imshow("键盘响应", dst);
            setWindowTitle("键盘响应", "绿色偏移");
        }

        if (c == 52) {  // Key#4: 图像反转
            std::cout << "你按下了 '4' 键,正在应用图像反转。" << std::endl;
            bitwise_not(image, dst);  // 图像反转
            imshow("键盘响应", dst);
            setWindowTitle("键盘响应", "图像反转");
        }

        if (c == 53) {  // Key#5: 应用模糊效果
            std::cout << "你按下了 '5' 键,正在应用模糊效果。" << std::endl;
            GaussianBlur(image, dst, Size(15, 15), 0);  // 高斯模糊
            imshow("键盘响应", dst);
            setWindowTitle("键盘响应", "模糊效果");
        }
    }
}
解释:
  1. waitKey(100):等待用户按键并返回按键的 ASCII 值。如果在 100 毫秒内没有按键,返回 -1。

  2. cvtColor() :将图像转换为不同的颜色空间,COLOR_BGR2GRAY 用于灰度,COLOR_BGR2HSV 用于 HSV。

  3. Scalar():一个标量值,用来在原图上增加偏移,这里我们增加了绿色分量。

  4. bitwise_not():对图像进行反转(像素值取反)。

  5. GaussianBlur():应用高斯模糊,使图像变得模糊。

5. 程序主函数

main() 函数中,我们首先加载图像,然后调用 key_demo() 函数来启动键盘交互处理:

cpp 复制代码
int main() {
    // 加载图像
    Mat image = imread(PicPath);
    if (image.empty()) {
        std::cout << "无法加载图像!" << std::endl;
        return -1;
    }

    // 创建窗口
    namedWindow("键盘响应", WINDOW_NORMAL);
    resizeWindow("键盘响应", image.cols, image.rows);  // 设置窗口大小与图像一致

    // 启动键盘交互功能
    key_demo(image);

    waitKey(0);  // 等待用户按键
    destroyAllWindows();  // 关闭所有窗口
    return 0;
}

6. 完整功能总结

在程序中,用户通过按键操作来实时处理图像,操作包括:

  • 1:将图像转换为灰度图。

  • 2:将图像转换为 HSV 图。

  • 3:增加图像的绿色偏移。

  • 4:反转图像颜色。

  • 5:对图像应用高斯模糊效果。

  • Esc:退出程序。

每当用户按下一个键时,程序会实时显示图像的处理结果,并在窗口标题中显示相应的操作名称。

相关推荐
却道天凉_好个秋2 小时前
OpenCV(二十四):图像滤波
人工智能·opencv·计算机视觉
yolo_guo21 小时前
opencv 学习: 07 使用迭代器 (iterator) 遍历像素
linux·c++·opencv
却道天凉_好个秋1 天前
OpenCV(二十一):HSV与HSL
人工智能·opencv·计算机视觉
努力小周1 天前
基于ESP32的宠物喂食小屋
opencv·物联网·毕业设计·esp32·鸿蒙系统·毕设·宠物
粉色挖掘机1 天前
矩阵在图像处理中的应用
图像处理·深度学习·线性代数·矩阵
guygg882 天前
基于MATLAB的图像融合拼接GUI系统设计
opencv·计算机视觉·matlab
Wild_Pointer.2 天前
简析单目相机模型中的针孔模型
c++·数码相机·opencv
沉默媛2 天前
如何下载安装以及使用labelme,一个可以打标签的工具,实现数据集处理,详细教程
图像处理·人工智能·python·yolo·计算机视觉
唔皇万睡万万睡2 天前
基于模板匹配的数字和大写字母识别(Matlab)
图像处理·人工智能·机器学习·计算机视觉·matlab