OpenCV交互:Trackbar与键盘按键操作
引言
在计算机视觉开发中,实时交互是提升算法调试效率的重要手段。OpenCV提供了Trackbar和键盘事件处理两种核心交互方式,下面通过代码介绍基本使用方法
1 Trackbar基础操作
1.1 Trackbar创建
#include "stdio.h"
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
void onLightCallback(int pos,void * usrData)
{
std::cout << pos << std::endl;
// 强制类型转换
Mat src = *(Mat*)(usrData);
Mat dst;
add(src, Scalar(pos, pos, pos), dst);
imshow("亮度与对比度调节", dst);
}
void onContrastCallback(int pos, void* usrData)
{
std::cout << pos << std::endl;
pos = pos;
Mat src = *(Mat*)(usrData);
Mat dst;
multiply(src, Scalar(pos, pos, pos), dst);
imshow("亮度与对比度调节", dst);
}
int main()
{
cv::Mat srcImage=cv::imread("E:/image/lena.png");
int lightValue = 0;
int contrastValue = 0;
namedWindow("亮度与对比度调节",WINDOW_FREERATIO);
createTrackbar("亮度:", "亮度与对比度调节",&lightValue,100, onLightCallback,&srcImage);
createTrackbar("对比度:", "亮度与对比度调节", &contrastValue, 5, onContrastCallback, &srcImage);
imshow("亮度与对比度调节", srcImage);
cv::waitKey(0);
destroyAllWindows();
return 0;
}
1.2 关键参数说明
createTrackbar
参数解析:- 名称:显示在滑动条左侧的标签
- 窗口:必须预先创建的窗口名称
- 绑定变量:存储当前滑块位置的整型变量指针
- 最大值:滑动条取值范围[0, max_value]
- 回调函数:值改变时自动触发
- 参数:传递参数给回调函数
- 回调函数:onContrastCallback和onLightCallback每次 Trackbar 的数值变化都会调用回调函数。
2 键盘事件处理
2.1 按键检测基础框架
{
while (true) {
int key = cv::waitKey(delay); // 30ms延迟
// 常规按键检测(ASCII码)
if (key == 's') { // 保存图像
std::cout << "Image saved!" << std::endl;
}
// 特殊按键检测
else if (key == 27 || key == 'q') { // ESC或Q退出
break;
}
}
}
2.2 按键处理要点
waitKey()
返回值为按键ASCII码cv::waitKeyEx()
支持扩展按键
3 参考代码
使用按键“WSAD”进行亮度和对比对调节,也可以使用trackbar进行调节.
#include "stdio.h"
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
void onLightCallback(int pos,void * usrData)
{
std::cout << pos << std::endl;
// 强制类型转换
Mat src = *(Mat*)(usrData);
Mat dst;
add(src, Scalar(pos, pos, pos), dst);
imshow("亮度与对比度调节", dst);
}
void onContrastCallback(int pos, void* usrData)
{
std::cout << pos << std::endl;
pos = pos;
Mat src = *(Mat*)(usrData);
Mat dst;
multiply(src, Scalar(pos, pos, pos), dst);
imshow("亮度与对比度调节", dst);
}
int main()
{
cv::Mat srcImage=cv::imread("E:/image/lena.png");
int lightValue = 0;
int contrastValue = 0;
namedWindow("亮度与对比度调节",WINDOW_FREERATIO);
createTrackbar("亮度:", "亮度与对比度调节",&lightValue,100, onLightCallback,&srcImage);
createTrackbar("对比度:", "亮度与对比度调节", &contrastValue, 5, onContrastCallback, &srcImage);
imshow("亮度与对比度调节", srcImage);
while (true) {
int key = cv::waitKey(30); // 30ms延迟
if (key >= 0)
{
std::cout << key << std::endl;
// 常规按键检测(ASCII码)
if (key == 's') { // 保存图像
std::cout << "Image saved!" << std::endl;
}
// 特殊按键检测
else if (key == 27 || key == 'q') { // ESC或Q退出
break;
}
else if (key == 'a') { //
lightValue = lightValue + 10;
onLightCallback(lightValue, &srcImage);
}
else if (key == 'w') { //
contrastValue = contrastValue + 1;
onContrastCallback(contrastValue, &srcImage);
}
else if (key == 'd') { //
lightValue = lightValue - 10;
onLightCallback(lightValue, &srcImage);
}
else if (key == 's') { //
contrastValue = contrastValue - 1;
onContrastCallback(contrastValue, &srcImage);
}
}
}
cv::destroyAllWindows();
return 0;
}