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 サイトの他の関連記事を参照してください。