web-dev-qa-db-ja.com

c ++および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]を使用しようとしました。出力画像のピクセルの色が変わらない理由がまだわかりません。ありがとう

37
grll

新しいピクセル値をコピーして画像に戻す以外のすべてを行いました。

この行は、ピクセルのコピーをローカル変数に取り込みます。

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;
    }
}
59
Roger Rowland

参照を使用するだけです:

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

パフォーマンス上の理由から.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のループでピクセルを反復処理します

13
Flocke