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