C ++ и Opencv Получить и устанавливать цвет пикселя на коврик

StackOverflow https://stackoverflow.com//questions/23001512

Вопрос

Я пытаюсь установить новое цветовое значение для некоторого пикселя в CV :: Mat Image Мой код ниже:

    Mat image = img;
    for(int y=0;y<img.rows;y++)
    {
        for(int x=0;x<img.cols;x++)
        {
        Vec3b color = image.at<Vec3b>(Point(x,y));
        if(color[0] > 150 && color[1] > 150 && color[2] > 150)
        {
            color[0] = 0;
            color[1] = 0;
            color[2] = 0;
            cout << "Pixel >200 :" << x << "," << y << endl;
        }
        else
        {
            color.val[0] = 255;
            color.val[1] = 255;
            color.val[2] = 255;
        }
    }
    imwrite("../images/imgopti"+to_string(i)+".tiff",image);
.

, похоже, получают хороший пиксель в выходе (с Cout), однако в выходном изображении (с IMWrite) соответствующие пикселя не изменяются.Я уже попробовал использовать color.val [0] .. Я до сих пор не могу понять, почему цвета пикселей в выходном изображении не меняются. спасибо

Это было полезно?

Решение

Вы сделали все, кроме скопируйте новое значение пикселя обратно на изображение.

Эта строка принимает копию пикселя в локальную переменную:

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

Итак, после изменения color, как вам требуется, просто установите его назад:

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

Так, в полном объеме, что-то подобное:

Mat image = img;
for(int y=0;y<img.rows;y++)
{
    for(int x=0;x<img.cols;x++)
    {
        // get pixel
        Vec3b color = image.at<Vec3b>(Point(x,y));

        // ... do something to the color ....

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

Другие советы

Просто используйте ссылку:

Vec3b & color = image.at<Vec3b>(y,x);
color[2] = 13;
.

Я бы не использовал .at по причинам эффективности.

Определить структуру:

//#pragma pack(push, 2) //not useful (see comments below)
struct RGB {
    uchar blue;
    uchar green;
    uchar red;  };
.

А потом используйте это как это на вашем cv :: mat image:

RGB& rgb = image.ptr<RGB>(y)[x];
.

image.ptr (y) дает указатель для сканирования y.И итерации через пиксели с петлями X и Y

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top