OpenCV を使用する場合、特定のピクセルのチャネル値にアクセスすることは、画像処理タスクにとって重要な場合があります。 。この記事では、「特定のピクセルのチャネル値を取得するにはどうすればよいですか?」という一般的な質問に対処します。
Mat オブジェクト foo で表される画像が一般的に使用される 8 ビットであると仮定します。チャネルごと (CV_8UC3) 形式でチャネル値を取得するには、次の手順が必要です。
for(int i = 0; i < foo.rows; i++) { for(int j = 0; j < foo.cols; j++) { Vec3b bgrPixel = foo.at<Vec3b>(i, j); // Process B, G, and R values here... } }
このコードでは、Vec3b は 3 チャネル ベクトルを表し、各チャネルは青に対応します。緑、赤 (BGR) の値。
パフォーマンスの最適化:
パフォーマンス上の理由から、データ バッファーへの直接アクセスが優先される場合があります。
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 B, G, and R values here... } }
または、行ベースのアクセスを使用することもできます。
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 B, G, and R values here... } }
これらのメソッドに従うことで、OpenCV のさまざまな画像処理タスクの個々のピクセルのチャネル値を効率的に取得できます。 .
以上がOpenCV Mat イメージ内の特定のピクセルのチャネル値にアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。