OpenCV отображает неправильный цвет - PullRequest
0 голосов
/ 26 февраля 2019

Я работаю с OpenCV, используя C ++.Я хотел бы создать изображение с 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);

                }
            }


        }
    }

1 Ответ

0 голосов
/ 26 февраля 2019

OpenCV использует формат изображения BGR (синий, зеленый, красный)

Когда вы пишете эту строку:

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

, это эквивалентно:

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

(См. этот SO-ответ , чтобы объяснить, почему.)

Который устанавливает только первый канал на максимум, а это синий.

Что вам нужно сделать, так этоотредактируйте весь пиксель следующим образом:

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

Заимствовано из этого ответа

Таким образом, ваш код должен выглядеть следующим образом:

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

            }
        }
    }
}
...