创建轨迹栏改变图像OpenCV的亮度
Creating trackbar changing brightness of image OpenCV
我在创建可调整显示图片亮度的轨迹栏时遇到问题。
这是我的代码(涉及亮度的部分):
int brightness_value = 25; //global values
const int max_value = 255;
int main()
{
Mat brightImage;
srcImage.copyTo(brightImage);
namedWindow("Bright Image");
moveWindow("Bright Image", 300, 600);
createTrackbar("Brightness", "Bright Image", &brightness_value, max_value);
for (int i = 0; i < brightImage.rows; i++)
{
for (int j = 0; j < brightImage.cols; j++)
{
Vec3b pixelColor;
pixelColor = brightImage.at<Vec3b>(Point(j, i));
for (int k = 0; k < 3; k++) //vector with 3 byte entries
{
if (pixelColor[k] + getTrackbarPos("Brightness", "Bright Image") > 255)
pixelColor[k] = 255;
else
pixelColor[k] += getTrackbarPos("Brightness", "Bright Image");
brightImage.at<Vec3b>(Point(j, i)) = pixelColor;
}
}
}
imshow("Bright Image", brightImage);
waitKey(0);
return 0;
}
这种方式只在程序启动时调整一次图像的亮度。但是当我想用轨迹栏改变它时,什么也没有发生。问题出在哪里,我应该怎么做才能让每次移动轨迹栏时亮度都会改变?
感谢您的帮助:)
这就是结果:(左边是原始图像,右边是改变了亮度的图像)
createTrackbar
接受一个指向回调函数的指针,当轨迹栏的位置改变时调用该回调函数。在此回调中,您应该使用更改后的亮度级别重新绘制图像,并通过 imshow
刷新 window。这种回调采用指向 void
数据的指针 - 它使您能够传递重绘图像时要使用的任何数据,在这种情况下它应该是指向输出图像的指针(并且可能是指向源图像的指针 - 您应该始终向原始图像添加新的亮度级别,而不是修改后的图像):
struct Params {
cv::Mat* src;
cv::Mat* dest;
};
void makeBrightness(int pos, void* data) {
Params* params = (Params*)data;
for (int i = 0; i < params->src->rows; i++) {
for (int j = 0; j < params->src->cols; j++) {
Vec3b pixelColor;
pixelColor = params->src->at<Vec3b>(Point(j, i));
for (int k = 0; k < 3; k++) {
if (pixelColor[k] + pos > 255)
pixelColor[k] = 255;
else
pixelColor[k] += pos;
params->dest->at<Vec3b>(Point(j, i)) = pixelColor;
}
}
}
imshow("Bright Image", *(params->dest));
}
int main()
{
int brightness_value = 25; //global values
const int max_value = 255;
Mat srcImage = cv::imread("D:/lena.jpg");
Mat brightImage;
srcImage.copyTo(brightImage);
namedWindow("Bright Image");
moveWindow("Bright Image", 300, 600);
Params params;
params.src = &srcImage;
params.dest = &brightImage;
createTrackbar("Brightness", "Bright Image", &brightness_value, max_value, makeBrightness, ¶ms);
makeBrightness(brightness_value, ¶ms); // for first painting your image
waitKey(0);
return 0;
我在创建可调整显示图片亮度的轨迹栏时遇到问题。
这是我的代码(涉及亮度的部分):
int brightness_value = 25; //global values
const int max_value = 255;
int main()
{
Mat brightImage;
srcImage.copyTo(brightImage);
namedWindow("Bright Image");
moveWindow("Bright Image", 300, 600);
createTrackbar("Brightness", "Bright Image", &brightness_value, max_value);
for (int i = 0; i < brightImage.rows; i++)
{
for (int j = 0; j < brightImage.cols; j++)
{
Vec3b pixelColor;
pixelColor = brightImage.at<Vec3b>(Point(j, i));
for (int k = 0; k < 3; k++) //vector with 3 byte entries
{
if (pixelColor[k] + getTrackbarPos("Brightness", "Bright Image") > 255)
pixelColor[k] = 255;
else
pixelColor[k] += getTrackbarPos("Brightness", "Bright Image");
brightImage.at<Vec3b>(Point(j, i)) = pixelColor;
}
}
}
imshow("Bright Image", brightImage);
waitKey(0);
return 0;
}
这种方式只在程序启动时调整一次图像的亮度。但是当我想用轨迹栏改变它时,什么也没有发生。问题出在哪里,我应该怎么做才能让每次移动轨迹栏时亮度都会改变? 感谢您的帮助:)
这就是结果:(左边是原始图像,右边是改变了亮度的图像)
createTrackbar
接受一个指向回调函数的指针,当轨迹栏的位置改变时调用该回调函数。在此回调中,您应该使用更改后的亮度级别重新绘制图像,并通过 imshow
刷新 window。这种回调采用指向 void
数据的指针 - 它使您能够传递重绘图像时要使用的任何数据,在这种情况下它应该是指向输出图像的指针(并且可能是指向源图像的指针 - 您应该始终向原始图像添加新的亮度级别,而不是修改后的图像):
struct Params {
cv::Mat* src;
cv::Mat* dest;
};
void makeBrightness(int pos, void* data) {
Params* params = (Params*)data;
for (int i = 0; i < params->src->rows; i++) {
for (int j = 0; j < params->src->cols; j++) {
Vec3b pixelColor;
pixelColor = params->src->at<Vec3b>(Point(j, i));
for (int k = 0; k < 3; k++) {
if (pixelColor[k] + pos > 255)
pixelColor[k] = 255;
else
pixelColor[k] += pos;
params->dest->at<Vec3b>(Point(j, i)) = pixelColor;
}
}
}
imshow("Bright Image", *(params->dest));
}
int main()
{
int brightness_value = 25; //global values
const int max_value = 255;
Mat srcImage = cv::imread("D:/lena.jpg");
Mat brightImage;
srcImage.copyTo(brightImage);
namedWindow("Bright Image");
moveWindow("Bright Image", 300, 600);
Params params;
params.src = &srcImage;
params.dest = &brightImage;
createTrackbar("Brightness", "Bright Image", &brightness_value, max_value, makeBrightness, ¶ms);
makeBrightness(brightness_value, ¶ms); // for first painting your image
waitKey(0);
return 0;