ホームページ > バックエンド開発 > C++ > OpenCV 行列のピクセル値に効率的にアクセスするにはどうすればよいですか?

OpenCV 行列のピクセル値に効率的にアクセスするにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-07 13:46:12
オリジナル
942 人が閲覧しました

How to Efficiently Access Pixel Values in an OpenCV Matrix?

OpenCV 行列のピクセル値へのアクセス

OpenCV Mat イメージからのピクセル値の取得は、データ構造に基づいたさまざまな方法で実行できます。ピクセルを表すために使用されます。

タイプ CV_8UC3 の画像を想定すると、ここで、各ピクセルは 3 つの 8 ビット符号なしチャネル (BGR) で表され、特定のピクセルの値の取得は次のように実行できます。

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

        // Access and manipulate BGR values...
    }
}
ログイン後にコピー

Vec3b は 3 要素ベクトルのコンテナーであり、各要素が対応します。 B、G、R チャンネル値に変換します。

最適化パフォーマンス

パフォーマンスを向上させるには、データ バッファーへの直接アクセスを使用できます:

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 BGR values...
    }
}
ログイン後にコピー

または、row() メソッドを使用して個々の行にアクセスできます:

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 BGR values...
    }
}
ログイン後にコピー

以上がOpenCV 行列のピクセル値に効率的にアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート