gpt4 book ai didi

c++ - 使用 OpenCV 修改图像时 RGB 值错误

转载 作者:行者123 更新时间:2023-11-28 07:19:14 24 4
gpt4 key购买 nike

对 C++ 相当陌生,我一直在使用 OpenCV 库。我正在尝试为图像查看器创建调光功能。这是void dim(int val)的主体.

我在每个像素上循环,获取对 Vec3b 中像素的 RGB 值的引用,然后将它们减少一些变化因子,从 val / 255 计算得出。 (其中 0 <= val <= 255。但由于某种原因,pix[0] 等都被设置为 0,这意味着对于 val 的任何值,图像都会变黑。

可能在这里用浮点做了一些有点愚蠢的事情,或者误解了 OpenCV 的某些方面;但我看不到它是什么。

for(int x = 0; x < rows; x++) {
for(int y = 0; y < cols; y++) {
Vec3b &pix = dst.at<Vec3b>(x,y);

float change = val / 255.0f;
pix[0] = (uchar)(pix[0] * change);
pix[1] = (uchar)(pix[1] * change);
pix[2] = (uchar)(pix[2] * change);
}
}

提前致谢!

最佳答案

OpenCV 有一个关于 changing the contrast and brightness of an image 的文档.一般来说,它对每个像素应用 alpha * pixel_value + beta。由于您只需要调整图像的亮度,alpha 可以设置为1.0。这是修改后的 dim() 函数。

// negative beta dims image
void dim(Mat& src, Mat& dst, int beta) {
for(int y = 0; y < src.rows; y++) {
for(int x = 0; x < src.cols; x++) {
for(int channel = 0; channel < 3; channel++) {
dst.at<Vec3b>(y, x)[channel] = saturate_cast<uchar>(src.at<Vec3b>(y, x)[channel] + beta);
}
}
}
}

读什么saturate_cast如果有兴趣的话。

测试上面的功能:

int main( int argc, char** argv )
{
int beta;
Mat src = imread(...);
Mat dst = Mat::zeros(src.size(), src.type());
namedWindow("src", CV_WINDOW_AUTOSIZE);
imshow("src", src);
dim(src, dst, -200);
namedWindow("dst", CV_WINDOW_AUTOSIZE);
imshow("dst", dst);

waitKey(0);
return 0;
}

关于c++ - 使用 OpenCV 修改图像时 RGB 值错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19760449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com