私のコードは次のとおりです: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]を使用しようとしました。出力画像のピクセルの色が変わらない理由がまだわかりません。ありがとう
新しいピクセル値をコピーして画像に戻す以外のすべてを行いました。
この行は、ピクセルのコピーをローカル変数に取り込みます。
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イメージで次のように使用します:
RGB& rgb = image.ptr<RGB>(y)[x];
image.ptr(y)は、スキャンラインyへのポインターを提供します。そして、xとyのループでピクセルを反復処理します