c++opencvtrackbar

Creating trackbar changing brightness of image OpenCV


I've got a problem with creating a trackbar which would adjust brightness of the displayed picture.

This is my code (part which is involved with brightness):

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;
}

This way the brightness of the image is adjusted only once, when the program starts. But when I want to change it with the trackbar nothing happens. Where is the problem, how should I do it so the brightness will change every time I move the trackbar? Thanks for any help :)

And that's the result: (on the left original image, on the right with changed brightness) result


Solution

  • createTrackbar takes a pointer to callback function which is called when position of trackbar is being changed. In this callback you should redrawn your image with changed brightness level and refresh window by imshow. Such callback takes a pointer to void data - it enables you to pass any data you want to use when redrawing your image, in this case it should be pointer to output image (and probably a pointer to source image - you should always add new brightness level to original image, not modified one):

    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;