>백엔드 개발 >C++ >OpenCV 매트릭스에서 픽셀 값에 효율적으로 액세스하는 방법은 무엇입니까?

OpenCV 매트릭스에서 픽셀 값에 효율적으로 액세스하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-07 13:46:12937검색

How to Efficiently Access Pixel Values in an OpenCV Matrix?

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

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