创建滑动条 —— createTrackbar
createTrackbar是OpenCV中的一个函数,用于创建一个可调节的滑动条(Trackbar),以便在图像处理过程中实时调整参数
int cv::createTrackbar(const String & trackbarname, // 滑动条的名称,作为字符串传递
const String & winname, // 滑动条的窗口名称,通常是显示图像的窗口名称
int * value, // 指向整数变量的指针,该指针指向的值反映滑块的位置,创建后,滑块位置由此变量定义
int count, // 滑动条的最大取值
TrackbarCallback onChange = 0, // 回调函数:每次滑块更改位置时要调用的函数的指针
void * userdata = 0 // 传递给回调函数的可选参数
)
其中回调函数的定义如下:
void onChange(int value, void* userdata) // void* userdata 参数是可选的
{
// 滑动条值发生变化时执行的操作
}
可以看到,回调函数是可选参数,当默认为0时,则只更新value,要进行的操作在后面定义
例:二值化,选择参数阈值作为滑动条
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace std;
int main()
{
cv::Mat image = cv::imread("C:/Users/Opencv/temp/lena.png");
if (image.empty()) {
cout << "打开图片失败" <<endl;
return -1;
}
cv::namedWindow("img");
cv::imshow("img", image);
int value = 128;
cv::createTrackbar("阈值", "img", &value, 255);
while (true)
{
cv::Mat thrseImg;
cv::threshold(image, thrseImg, value, 255, cv::THRESH_BINARY);
cv::imshow("img", thrseImg); // 注意:窗口的名字要和之前的一样
//cv::imshow("取不同名字时", thrseImg);
char key = cv::waitKey(10);
if (key == 27 || key == 'q')
{
break;
}
}
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
注:上述代码中,如果while循环里imshow展示的窗口名字跟之前不同,则会新开这个窗口作为滑动结果窗口,如下图所示,在原图img中滑动数值,原图不会改变,改变的是另一个窗口。
使用回调函数,来简化上述代码
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace std;
void callback(int value, void*);
cv::Mat image ,thrseImg; // 定义成全局变量,才能同时在回调函数中调用
int main()
{
image = cv::imread("C:/Users/jutze/ljw_C++/Opencv/temp/lena.png");
if (image.empty()) {
cout << "打开图片失败" <<endl;
return -1;
}
cv::namedWindow("img");
cv::imshow("img", image);
int value = 128;
cv::createTrackbar("阈值", "img", &value, 255, callback);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
static void callback(int value, void*)
{
cv::threshold(image, thrseImg, value, 255, cv::THRESH_BINARY);
cv::imshow("img", thrseImg);
}
此外,OpenCV还提供了鼠标响应函数setMouseCallback()和键盘响应函数setKeyboardCallback(),通过在指定窗口进行鼠标点击或键盘按键,来触发回调函数,执行相关操作。但感觉实际使用的场景比较少,以后遇到再说吧。
再来一个python的例子,调整亮度对图片的影响
def aug_ok1(img, mask, brightness_value):
# 定义图像增强的变换列表
transform_ok = [
# A.ChannelShuffle(p=1),
A.RandomBrightnessContrast(brightness_limit=(brightness_value, brightness_value), contrast_limit=0, p=1)
]
transform_ok = A.Compose(transform_ok)
# 应用变换到图像和掩膜
transformed = transform_ok(image=img, mask=mask)
image = transformed["image"]
mask = transformed["mask"]
return image, mask
def on_brightness_change(value):
# 将滑动条值映射到范围 [-0.8, 0.8]
brightness_value = value / 100.0 * 1.6 - 0.8
# 调用图像增强函数
img1, _ = aug_ok1(img, label, brightness_value)
# 在窗口中显示图像
cv2.imshow("img1", img1)
if __name__ == "__main__":
img = cv2.imread('C:/Users/WA.jpg')
label = cv2.imread('C:/Users/WA.jpg', 0)
# 创建窗口并命名
cv2.namedWindow("img1")
# 创建滑动条
cv2.createTrackbar("Brightness", "img1", 0, 100, on_brightness_change)
# 初始化滑动条的初始值
cv2.setTrackbarPos("Brightness", "img1", 50)
# 显示原始图像
cv2.imshow("img", img)
# 等待按下Esc键退出
while cv2.waitKey(1) != 27:
pass
cv2.destroyAllWindows()