OpenCV에는 Mat 이미지 내의 픽셀 값에 액세스하고 조작하는 여러 가지 방법이 있습니다. 일반적인 시나리오 중 하나는 특정 픽셀의 채널 값을 검색하는 것입니다.
이미지가 8비트 부호 없는 정수로 3채널 이미지를 나타내는 CV_8UC3 형식으로 저장된 경우 값(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 중국어 웹사이트의 기타 관련 기사를 참조하세요!