С++ и opencv получают и задают пиксельный цвет для Mat
Я пытаюсь установить новое значение цвета для некоторого пикселя в изображение cv:: Mat, которое находится ниже:
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]. Я до сих пор не могу понять, почему пиксельные цвета в выходном изображении не меняются.
спасибо
Ответы
Ответ 1
Вы сделали все, кроме копирования нового значения пикселя обратно в изображение.
Эта строка берет копию пикселя в локальную переменную:
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;
}
}
Ответ 2
просто используйте ссылку:
Vec3b & color = image.at<Vec3b>(y,x);
color[2] = 13;
Ответ 3
Я бы не использовал .at по соображениям производительности.
Определите структуру:
//#pragma pack(push, 2) //not useful (see comments below)
struct RGB {
uchar blue;
uchar green;
uchar red; };
И затем используйте его так на вашем изображении cv:: Mat:
RGB& rgb = image.ptr<RGB>(y)[x];
image.ptr(y) дает вам указатель на строку сканирования y. И итерация через пиксели с петлями x и y