gpt4 book ai didi

c++ - OpenCV 显示错误的颜色

转载 作者:太空宇宙 更新时间:2023-11-03 22:18:22 25 4
gpt4 key购买 nike

我正在使用 C++ 处理 OpenCV。我想创建一个具有 3 种颜色的图像:红色、白色和黑色。详细地说,根据某些条件,我希望背景为红色,然后是白色和黑色。

我遇到的问题是,当我将颜色设置为白色时,它会变成蓝色。

有人能知道为什么会这样以及如何解决吗?

这是我的代码:

    //initial image total red

cv::Mat image(Size(w, h), CV_8UC3, cv::Scalar(0, 0, 255));

for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
int pixel_v = (int)imggray.at<uchar>(i,j);
if (pixel_v < 200) {
int pixel_bl = (int)imgBool.at<uchar>(i, j);
if (pixel_bl > 200) {
//HERE A WANT WHITE PIXELS, but they are blue
image.at<Vec3b>(i, j) = (255, 255, 255);
}
else {
//black: this works
image.at<Vec3b>(i, j) = (0, 0, 0);

}
}


}
}

最佳答案

OpenCV使用图像格式BGR(Blue, Green Red)

当你写这行时:

 image.at<Vec3b>(i, j) = (255, 255, 255);             

它等价于:

image.at<Vec3b>(i, j) = (255);             

(参见 this SO answer 解释原因。)

它只将第一个 channel 设置为最大,并且恰好是蓝色。

您需要做的是像这样编辑整个像素:

    // get pixel
Vec3b color = image.at<Vec3b>(Point(x,y));

color[0] = 255;
color[1] = 255;
color[2] = 255;

// set pixel
image.at<Vec3b>(Point(x,y)) = color;

Borrowed from this answer

因此您的代码需要如下所示:

cv::Mat image(Size(w, h), CV_8UC3, cv::Scalar(0, 0, 255));          

for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
int pixel_v = (int)imggray.at<uchar>(i,j);
if (pixel_v < 200) {
int pixel_bl = (int)imgBool.at<uchar>(i, j);
if (pixel_bl > 200) {
//HERE A WANT WHITE PIXELS, but they are blue
Vec3b color = image.at<Vec3b>(Point(i,j));
color[0] = 255;
color[1] = 255;
color[2] = 255;
image.at<Vec3b>(Point(i,j)) = color;
}
else {
image.at<Vec3b>(i, j) = (0, 0, 0);

}
}
}
}

关于c++ - OpenCV 显示错误的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54887825/

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