cv::createTrackbar
cv::createTrackbar
是OpenCV库中的一个函数,用于创建一个图形用户界面 (GUI) 中的滑动条控件,允许用户在应用程序运行时调整特定参数的值。这个函数的调用方式如下:
int cv::createTrackbar(const std::string& trackbarName, const std::string& windowName, int* value, int count, cv::TrackbarCallback onChange = 0, void* userdata = 0);
参数解释:
trackbarName
:滑动条的名称,显示在滑动条旁边的标签上。windowName
:包含滑动条的窗口的名称。value
:一个整数指针,用于存储滑动条的当前值。当用户移动滑动条时,这个值会被更新。count
:滑动条的最大值(最小值默认为0)。这决定了滑动条的取值范围。onChange
:一个可选的回调函数,在用户移动滑动条时会被调用。它允许您在滑动条值变化时执行自定义操作。userdata
:一个可选的用户数据指针,传递给回调函数,允许您在回调函数中使用自定义数据。通过创建滑动条,用户可以在运行时交互地调整参数的值,这对于图像处理和计算机视觉应用程序非常有用,允许用户实时观察效果并进行微调。
#include
// 回调函数,用于处理轨迹条值的变化
void onTrackbar(int value, void* userdata) {
cv::Mat* imagePtr = static_cast<cv::Mat*>(userdata);
// 设置对比度增强参数
double alpha = static_cast<double>(value) / 100.0;
// 增强图像对比度
cv::Mat enhancedImage = (*imagePtr) * alpha;
// 显示增强后的图像
cv::imshow("Enhanced Image", enhancedImage);
}
int main() {
// 读取输入图像
cv::Mat inputImage = cv::imread("1.jpg");
// 检查图像是否成功加载
if (inputImage.empty()) {
std::cout << "无法加载输入图像" << std::endl;
return -1;
}
// 创建窗口
cv::namedWindow("Enhanced Image");
// 创建轨迹条
int initialContrast = 100; // 初始对比度值
cv::createTrackbar("Contrast", "Enhanced Image", &initialContrast, 300, onTrackbar, &inputImage);
// 显示初始图像
cv::imshow("Enhanced Image", inputImage);
// 等待按键事件
cv::waitKey(0);
return 0;
}
image.at
是一种在OpenCV中用于访问图像像素值的常见方式。让我解释这个表达式的各个部分:
image
:这是一个OpenCV的cv::Mat
对象,表示图像。cv::Mat
是OpenCV中用于表示图像和矩阵的数据结构。
at
:这是使用at
方法来访问图像的像素值的一种方式。at
方法接受图像中的行和列索引作为参数,并返回该位置的像素值。
:这是模板参数,指定了图像中每个像素的数据类型。在这种情况下,Vec3b
表示每个像素是一个3通道的彩色像素,其中每个通道都是8位无符号整数。
(y, x)
:这是要访问的像素的行和列坐标。y
表示行号,x
表示列号。
[c]
:这是通道索引,表示要访问的通道。在3通道彩色图像中,通常有三个通道,分别对应于红色、绿色和蓝色。通过 [c]
,您可以选择要访问的通道,其中 c
的值通常为0(红色通道)、1(绿色通道)或2(蓝色通道)。
因此,image.at
允许您访问图像在 (x, y)
处指定通道 c
上的像素值。这对于图像处理和像素级操作非常有用。
#include
#include
#include
#include
using namespace std;
using namespace cv;
#include
#include
using namespace cv; //包含cv命名空间
#include
// 描述:全局函数声明
//
static void on_ContrastAndBright(int, void*);
static void ShowHelpText();
//- -------【全局变量声明部分】-------------------------
// 描述: 全局变量声明
//、
int g_nContrastValue; //对比度值
int g_nBrightValue; //亮度值
Mat g_srcImage, g_dstImage;
// 【main()函数】--------------------------
// 描述: 控制台应用程序的入口函数, 我们的程序从这里开始
//
int main()
{
//【1】读取输入图像
g_srcImage = imread("1.jpg");
if (!g_srcImage.data) { printf("读取图片错误,请确定目录下是否有imread 函数指定图片存在~!"); return false; }
g_dstImage = Mat::zeros(g_srcImage.size(), g_srcImage.type());
// 【2】设定对比度和亮度的初值
g_nContrastValue = 80;
g_nBrightValue = 80;
//【3】创建效果图窗口
namedWindow("【效果图窗口】", 1);
//【4】创建轨迹条
createTrackbar("对比度: ", "【效果图窗口】", &g_nContrastValue, 300, on_ContrastAndBright);
createTrackbar("亮度: ", "【效果图窗口】", &g_nBrightValue, 200, on_ContrastAndBright);
//【5】进行回调函数初始化
on_ContrastAndBright(g_nContrastValue, 0);
on_ContrastAndBright(g_nBrightValue, 0);
//【6】按下"q"键时, 程序退出
while (char(waitKey(1)) != 'q') {}
return 0;
}
//-------------------【on_ContrastAndBright()函数】-
// 描述: 改变图像对比度和亮度值的回调函数
//------------
static void on_ContrastAndBright(int, void*)
{
// 创建窗口
namedWindow("【原始图窗口】", 1);
//三个 for循环,执行运算g_dstImage(i,j) = a*g_srcImage(i,j) + b
for( int y = 0; y< g_srcImage. rows; y++)
{
for (int x = 0; x < g_srcImage.cols; x++)
{
for (int c = 0; c < 3; c++)
{
g_dstImage.at<Vec3b>(y, x)[c] =
saturate_cast<uchar>((g_nContrastValue * 0.01) * (g_srcImage.at<Vec3b>(y, x)[c]) + g_nBrightValue);
}
}
}
//显示图像
imshow("【原始图窗口】", g_srcImage);
imshow("【效果图窗口】", g_dstImage);
}
#include
// 全局变量用于存储对比度值
int contrast = 100;
// 回调函数,用于处理轨迹条值的变化
void onTrackbar(int value, void* userdata) {
// 将轨迹条值存储到全局变量中
contrast = value;
}
int main() {
// 打开默认相机(通常是第一个相机)
cv::VideoCapture cap(0);
// 检查相机是否成功打开
if (!cap.isOpened()) {
std::cout << "无法打开相机" << std::endl;
return -1;
}
// 创建窗口
cv::namedWindow("Camera Feed");
// 创建轨迹条
cv::createTrackbar("对比度", "Camera Feed", &contrast, 200, onTrackbar);
while (true) {
cv::Mat frame;
cap >> frame; // 从相机获取帧
// 增强图像对比度
cv::Mat enhancedFrame = frame * (contrast / 100.0);
// 显示增强后的图像
cv::imshow("Camera Feed", enhancedFrame);
// 检查是否按下ESC键,如果是则退出循环
if (cv::waitKey(1) == 27) {
break;
}
}
// 关闭相机
cap.release();
// 销毁窗口
cv::destroyAllWindows();
return 0;
}