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

标签 c++ opencv rgb

我正在使用 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/

相关文章:

macos - openCV 不能在 Leopard 上编译

python - 从 tkinter 颜色名称获取 RGB 值

c++ - 在不单独绘制每个 channel 的情况下移动颜色 channel ?

c++ - 将 cv::mat 加载到更快的 rcnn blob

opencv - CV2 plotChessboardCorners 和 cornersSubPix 期望的点的形状/顺序是什么?

java - 将 BufferedImage 转换为 OpenCv Mat

python - 在 python 3 问题中使用 PIL 的 RGB 值问题

c++ - 包含 <vector> 时的奇怪行为

c++ - 阻止 `const` 成员在另一个别名下被编辑

c++ - 研究简单的代码反汇编输出和内存映射