OpenCV では、マット イメージ内のピクセル値にアクセスして操作する方法がいくつかあります。一般的なシナリオの 1 つは、特定のピクセルのチャネル値を取得することです。
画像が CV_8UC3 形式で保存されている場合、これは 8 ビット符号なし整数で 3 チャネルの画像を表します値 (BGR) を使用すると、Vec3b データ型を使用して個々のチャネルにアクセスできます。たとえば、foo がこのタイプの Mat イメージである場合、次のコードを使用してピクセルを反復処理できます。
for (int i = 0; i < foo.rows; i++) { for (int j = 0; j < foo.cols; j++) { Vec3b bgrPixel = foo.at<Vec3b>(i, j); // Access the pixel's BGR values... } }
パフォーマンス上の理由から、次のコードを使用できます。データ バッファーにアクセスしてピクセル値に直接アクセスすることもできます。これによりアクセスが高速化されますが、データ変換とチャネル オフセットの手動処理がさらに必要になります。これを行う方法の例を次に示します。
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 // Access the pixel's 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 // Access the pixel's BGR values... } }
OpenCV はピクセル値を RGB ではなく BGR 形式 (青、緑、赤) で保存することに注意してください。チャンネルにアクセスするときは、その点に注意する必要があります。
以上がOpenCV で Mat イメージのピクセル チャネル値にアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。