ホームページ >バックエンド開発 >C++ >OpenCV でマット イメージからピクセル チャネル値を抽出する方法は?

OpenCV でマット イメージからピクセル チャネル値を抽出する方法は?

DDD
DDDオリジナル
2024-11-15 22:47:02778ブラウズ

How to Extract Pixel Channel Values from a Mat Image in OpenCV?

OpenCV: マット イメージからピクセル チャネル値を抽出する

質問: マット イメージ内の特定のピクセルのチャネル値を取得するにはどうすればよいですか? ?

答え:

ピクセル タイプが CV_8UC3 (8 ビット符号なし 3 チャネル イメージ) である Mat オブジェクトの場合、次のメソッドを使用できます。

for(int i = 0; i < foo.rows; i++)
{
    for(int j = 0; j < foo.cols; j++)
    {
        Vec3b bgrPixel = foo.at<Vec3b>(i, j);

        // Process the BGR values...
    }
}

このコードでは、Vec3b は各チャネルの 8 ビット符号なし整数を持つ 3 チャネル ピクセルを表します。 at は、指定された行と列のピクセル値にアクセスできるようにするメンバー関数です。

パフォーマンスの最適化:

パフォーマンスを向上させるには、データ バッファーへのアクセスを検討してください。直接:

uint8_t* pixelPtr = (uint8_t*)foo.data;
int cn = foo.channels();
Scalar_<uint8_t> bgrPixel;

for(int i = 0; i < foo.rows; i++)
{
    for(int j = 0; j < foo.cols; j++)
    {
        bgrPixel.val[0] = pixelPtr[i*foo.cols*cn + j*cn + 0]; // B
        bgrPixel.val[1] = pixelPtr[i*foo.cols*cn + j*cn + 1]; // G
        bgrPixel.val[2] = pixelPtr[i*foo.cols*cn + j*cn + 2]; // R

        // Process the BGR values...
    }
}

または、行メソッドを使用できます:

int cn = foo.channels();
Scalar_<uint8_t> bgrPixel;

for(int i = 0; i < foo.rows; i++)
{
    uint8_t* rowPtr = foo.row(i);
    for(int j = 0; j < foo.cols; j++)
    {
        bgrPixel.val[0] = rowPtr[j*cn + 0]; // B
        bgrPixel.val[1] = rowPtr[j*cn + 1]; // G
        bgrPixel.val[2] = rowPtr[j*cn + 2]; // R

        // Process the BGR values...
    }
}

注: OpenCV は内部的に、RGB ではなく BGR 形式で画像を保存します。

以上がOpenCV でマット イメージからピクセル チャネル値を抽出する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。