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

C++와 OpenCV로 색상 공간 변환하기: cvtColor() 함수 활용 가이드

색상 공간(Color Space)은 색을 표현하는 모델을 의미합니다. 색을 기술하는 방법은 여러 가지가 있으며, 대표적으로 RGB, CMYK, HSV, 그레이스케일(Grayscale) 등이 있습니다.

이번 글에서는 'imgproc.hpp'라는 새로운 헤더 파일을 사용합니다. 이 헤더는 Image Processing(이미지 처리)의 약자로, OpenCV의 이미지 처리 관련 함수들이 정의되어 있습니다. 색상 공간을 변환하려면 OpenCV의 cvtColor() 함수를 사용해야 하는데, 이 함수가 바로 'imgproc' 헤더 파일에 정의되어 있기 때문에 해당 헤더를 포함시킨 것입니다.

먼저 두 개의 행렬(Mat)과 두 개의 윈도우를 선언합니다. 행렬은 이미지를 담고 변환 결과를 저장하는 데 사용되며, 윈도우는 원본 이미지와 변환된 이미지를 화면에 출력하는 역할을 합니다. 그다음 'cat.jpg'라는 이미지 파일을 myImage 행렬에 불러옵니다.

이후 cvtColor(myImage, myImage_Converted, COLOR_RGB2GRAY) 구문을 호출하면, 'myImage'의 RGB 색상 공간이 그레이스케일로 변환되어 myImage_Converted 행렬에 저장됩니다.

cvtColor() 함수의 기본 형식은 다음과 같습니다.

cvtColor(원본 행렬(Source Matrix), 대상 행렬(Destination Matrix), 색상 공간 변환 코드(Color Space Conversion Code))

이 프로그램에서 원본 행렬은 'myImage', 대상 행렬은 'myImage_Converted', 색상 공간 변환 코드는 COLOR_RGB2GRAY에 해당합니다.

참고: 자주 사용되는 변환 코드

  • COLOR_RGB2GRAY / COLOR_BGR2GRAY: RGB 또는 BGR 이미지를 그레이스케일로 변환
  • COLOR_BGR2HSV: BGR 이미지를 HSV 색상 공간으로 변환
  • COLOR_GRAY2BGR: 그레이스케일 이미지를 BGR로 변환

참고로 OpenCV는 이미지를 불러올 때 기본적으로 BGR 순서로 픽셀 값을 저장하므로, 실무에서는 COLOR_BGR2GRAY를 사용하는 경우가 더 많습니다.

아래 프로그램은 OpenCV에서 RGB 이미지를 그레이스케일 이미지로 변환하는 전체 예제입니다.

예제 코드

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main(int argc, const char** argv) {
    Mat myImage;//이미지를 불러올 행렬 선언//
    Mat myImage_Converted;//변환된 이미지를 저장할 행렬 선언// 
    namedWindow("Actual_Image");//원본 이미지를 표시할 윈도우 선언//
    namedWindow("Converted_Image");//변환된 이미지를 표시할 윈도우 선언//
    myImage = imread("cat.jpg");//myImage 행렬에 이미지 불러오기//
    cvtColor(myImage,myImage_Converted, COLOR_RGB2GRAY);//RGB를 그레이스케일로 변환//
    imshow("Actual_Image",myImage);//원본 이미지 출력//
    imshow("Converted_Image",myImage_Converted);//변환된 이미지 출력// 
    waitKey(0);//키 입력 대기
    destroyAllWindows();//모든 윈도우 닫기
    return 0;
}

실행 결과

프로그램을 실행하면 컬러로 불러온 원본 고양이 이미지와 함께, 그레이스케일로 변환된 흑백 이미지가 두 개의 윈도우에 나란히 표시됩니다. 키보드 아무 키나 누르면 모든 창이 닫히며 프로그램이 종료됩니다.