【问题标题】:Creating trackbar changing brightness of image OpenCV创建轨迹栏改变图像OpenCV的亮度
【发布时间】:2021-02-09 15:19:18
【问题描述】:

我在创建可调整显示图片亮度的轨迹栏时遇到问题。

这是我的代码(与亮度有关的部分):

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

这样,图像的亮度只在程序启动时调整一次。但是当我想用轨迹栏改变它时,什么也没有发生。问题出在哪里,我该怎么做才能使每次移动轨迹栏时亮度都会改变? 感谢您的帮助:)

结果是这样的:(左边是原始图像,右边是改变了亮度的图像)

【问题讨论】:

    标签: c++ opencv trackbar


    【解决方案1】:

    createTrackbar 带有一个指向回调函数的指针,该函数在轨迹栏位置发生变化时被调用。在此回调中,您应该使用更改的亮度级别重新绘制图像并通过imshow 刷新窗口。这样的回调需要一个指向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;
    

    【讨论】:

    • 非常感谢。我不知道应该有一个回调函数,吸取教训。 :) 现在一切都如我所愿。
    猜你喜欢
    • 2022-01-05
    • 2015-04-20
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多