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("键盘响应", "模糊效果");}}
}
解释:
-
waitKey(100):等待用户按键并返回按键的 ASCII 值。如果在 100 毫秒内没有按键,返回 -1。 -
cvtColor():将图像转换为不同的颜色空间,COLOR_BGR2GRAY用于灰度,COLOR_BGR2HSV用于 HSV。 -
Scalar():一个标量值,用来在原图上增加偏移,这里我们增加了绿色分量。 -
bitwise_not():对图像进行反转(像素值取反)。 -
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:退出程序。
每当用户按下一个键时,程序会实时显示图像的处理结果,并在窗口标题中显示相应的操作名称。
