当前位置: 首页 > news >正文

OpenCV 图像处理与键盘交互

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

1. 准备工作

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

2. 基础图像加载

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

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

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

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

3. 创建窗口并设置交互

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

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

4. 键盘交互与图像处理

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

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

  • 2 键: 转换为 HSV 图像。

  • 3 键: 增加绿色偏移。

  • 4 键: 应用图像反转。

  • 5 键: 应用高斯模糊。

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

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() 函数来启动键盘交互处理:

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:退出程序。

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

http://www.dtcms.com/a/600716.html

相关文章:

  • 长沙理工《人工智能基础A》实验(上机)报告实验三 电商数据可视化/图像处理
  • Elasticsearch 的结构化文档配置 - 递归分块实践
  • 如何在IIS中配置HTTP重定向
  • elasticsearch 安装 repository-oss 插件
  • 宝安做网站哪家好德阳网站建设熊掌号
  • 输入10个整数存放于数组中,并将最小的数与数组的第一个元素交换,最大的数与数组的最后一个元素交换
  • 从 WAL 到 Fluss->Flink CDC Postgres Connector 端到端同步实战
  • 数据结构 图 的邻接表建立
  • C++CUDA实战:通过两个图像算法,搞懂了GPU编程
  • RabbitMQ应用(2)
  • Spring Boot 中的消息队列集成:从 RabbitMQ 到 Kafka 的深度实践
  • Spring Boot 与 RabbitMQ 集成示例
  • 家纺 网站模版想自己做网站流程
  • 将 CentOS 风格的命令行提示符(如 [root@slave1 ~]#)修改为 Ubuntu 风格
  • k8s各种场景下排错思路以及命令 k8s常见问题故障处理思路
  • win32k源代码分析之win32k!IsSAS函数中的全局变量win32k!gfsSASModifiers = 3是什么时候被赋值的
  • 序列和可迭代
  • 16.udp_socket(二)
  • 如何在不使用iTunes的情况下在电脑上访问iPhone文件
  • python+websockets,报错RuntimeError: no running event loop
  • 自己做网站流程龙口市最新公告
  • 自助建站系统介绍wordpress 百度推广
  • 基于Springboot的汽车推荐系统设计与实现7f7h74np(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
  • DBLoss: Decomposition-based Loss Function for Time Series Forecasting 论文阅读
  • STM32F103学习笔记-16-RCC(第4节)-使用 HSI 配置系统时钟并用 MCO 监控系统时钟
  • Git 中新建学习分支 + 暂存修改 + VSCode 可视化查看改动(超详细教程)
  • Linux高效编程与实战:自动化构建工具“make/Makefile”和第一个系统程序——进度条
  • Docker 相关使用收录
  • 【详细步骤解析】爬虫小练习——爬取豆瓣Top250电影,最后以csv文件保存,附源码
  • Docker-存储