轨迹条: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 <opencv2/opencv.hpp>// 回调函数,用于处理轨迹条值的变化
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(y,x)[c]语法来设置对比度和亮度
image.at<Vec3b>(y, x)[c]
是一种在OpenCV中用于访问图像像素值的常见方式。让我解释这个表达式的各个部分:
-
image
:这是一个OpenCV的cv::Mat
对象,表示图像。cv::Mat
是OpenCV中用于表示图像和矩阵的数据结构。 -
at<Vec3b>(y, x)
:这是使用at
方法来访问图像的像素值的一种方式。at
方法接受图像中的行和列索引作为参数,并返回该位置的像素值。 -
<Vec3b>
:这是模板参数,指定了图像中每个像素的数据类型。在这种情况下,Vec3b
表示每个像素是一个3通道的彩色像素,其中每个通道都是8位无符号整数。 -
(y, x)
:这是要访问的像素的行和列坐标。y
表示行号,x
表示列号。 -
[c]
:这是通道索引,表示要访问的通道。在3通道彩色图像中,通常有三个通道,分别对应于红色、绿色和蓝色。通过[c]
,您可以选择要访问的通道,其中c
的值通常为0(红色通道)、1(绿色通道)或2(蓝色通道)。
因此,image.at<Vec3b>(y, x)[c]
允许您访问图像在 (x, y)
处指定通道 c
上的像素值。这对于图像处理和像素级操作非常有用。
#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>using namespace std;
using namespace cv;
#include <iostream>
#include <fstream>
using namespace cv; //包含cv命名空间
#include <opencv2/core/core.hpp>// 描述:全局函数声明
//
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) + bfor( 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 <opencv2/opencv.hpp>// 全局变量用于存储对比度值
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;
}