>  기사  >  백엔드 개발  >  OpenCV에서 Mat 이미지의 픽셀 채널 값에 어떻게 액세스합니까?

OpenCV에서 Mat 이미지의 픽셀 채널 값에 어떻게 액세스합니까?

DDD
DDD원래의
2024-11-25 01:46:14137검색

How do you access pixel channel values in a Mat image in OpenCV?

OpenCV의 Mat 이미지에서 픽셀 채널 값 추출

OpenCV에는 Mat 이미지 내의 픽셀 값에 액세스하고 조작하는 여러 가지 방법이 있습니다. 일반적인 시나리오 중 하나는 특정 픽셀의 채널 값을 검색하는 것입니다.

Vec3b 사용

이미지가 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.