Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 OpenCV에서 특정 픽셀 값 읽기: at() 메서드와 직접 접근 방식

OpenCV에서 특정 픽셀의 값을 읽으려면 'at()' 메서드'직접 접근(Direct Access)' 방식, 두 가지 방법을 사용할 수 있습니다. 이 글에서는 두 가지 방법을 모두 예제 코드와 함께 자세히 살펴보겠습니다.

방법 1: at() 메서드 사용하기

먼저 'at()' 메서드부터 알아보겠습니다. 아래 프로그램은 RGB 이미지에서 좌표 (10, 29)에 위치한 픽셀 값을 읽어오는 예제입니다.

예제 코드

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main() {
    Mat image; //이미지 행렬 선언//
    image = imread("sky.jpg"); //이미지 불러오기//
    int x = image.at<Vec3b>(10, 29)[0]; //픽셀 값 가져오기//
    int y = image.at<Vec3b>(10, 29)[1]; //픽셀 값 가져오기//
    int z = image.at<Vec3b>(10, 29)[2]; //픽셀 값 가져오기//
    cout << "파란 채널(B) 값: " << x << endl; //픽셀 값 출력//
    cout << "초록 채널(G) 값: " << y << endl; //픽셀 값 출력//
    cout << "빨강 채널(R) 값: " << z << endl; //픽셀 값 출력//
    system("pause"); //결과를 확인할 수 있도록 시스템 일시 정지//
    return 0;
}

실행 결과

C++로 OpenCV에서 특정 픽셀 값 읽기: at() 메서드와 직접 접근 방식

프로그램의 실행 결과는 콘솔 창에 표시됩니다. 여기서 다음 세 줄의 코드가 각각 서로 다른 채널의 픽셀 값을 가져오는 역할을 합니다.

int x = image.at<Vec3b>(10, 29)[0];
int y = image.at<Vec3b>(10, 29)[1];
int z = image.at<Vec3b>(10, 29)[2];

첫 번째 줄은 (10, 29) 좌표에 있는 첫 번째 채널(파란색, Blue)의 픽셀 값을 읽어 변수 'x'에 저장합니다. 두 번째 줄과 세 번째 줄은 각각 두 번째 채널(초록색, Green)과 세 번째 채널(빨간색, Red)의 값을 변수에 저장합니다.

참고로 OpenCV에서 Vec3b는 8비트 부호 없는 정수 3개로 구성된 벡터 타입으로, 채널 값을 BGR 순서로 저장합니다. 따라서 인덱스 [0]은 파란색, [1]은 초록색, [2]는 빨간색 채널을 의미하며, 흔히 사용하는 RGB 순서와 반대라는 점에 유의해야 합니다.

방법 2: 직접 접근(Direct Access) 방식 사용하기

이제 '직접 접근' 방식으로 픽셀 값을 읽는 방법을 알아보겠습니다. 아래 프로그램은 (10, 29) 위치의 픽셀 값을 함수 호출 연산자를 통해 바로 읽어옵니다.

예제 코드

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main() {
    Mat_<Vec3b> image; //이미지 행렬 선언//
    image = imread("sky.jpg"); //이미지 불러오기//
    Vec3b x = image(10, 29); //픽셀 값 가져오기//
    cout << x << endl; //픽셀 값 출력//
    system("pause"); //결과를 확인할 수 있도록 시스템 일시 정지//
    return 0;
}

실행 결과

C++로 OpenCV에서 특정 픽셀 값 읽기: at() 메서드와 직접 접근 방식

이 방식에서는 행렬을 Mat_<Vec3b> 타입으로 선언한 뒤, 괄호 () 연산자를 사용하여 원하는 좌표의 픽셀 값에 곧바로 접근합니다. 이렇게 얻은 Vec3b 객체에는 해당 픽셀의 B, G, R 세 채널 값이 모두 담겨 있으며, 이를 한 번에 출력하면 세 채널의 값을 동시에 확인할 수 있습니다.

정리하면, 개별 채널의 값만 필요할 때는 'at()' 메서드가 편리하고, 픽셀 전체의 채널 값을 한꺼번에 다루고 싶다면 직접 접근 방식이 더 효율적입니다. 상황에 맞게 두 방법을 활용해 보세요.