创建轨迹栏改变图像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, &params);
    makeBrightness(brightness_value, &params); // for first painting your image
    waitKey(0);
    return 0;