본문 바로가기

IT

OpenCV Scalar 클래스 활용법!

Scalar 클래스란 무엇인가?

OpenCV에서 Scalar 클래스는 이미지의 픽셀 값을 표현하거나 그리기 함수에서 색상을 지정할 때 사용되는 데이터 타입입니다.

일반적으로 cv::Scalar(b, g, r) 형태로 사용되며, 각 값은 Blue, Green, Red 순서의 8비트 정수입니다.

 

OpenCV Scalar

 

 

즉, RGB가 아닌 BGR 순서로 입력해야 원하는 색상이 출력됩니다.

색상뿐만 아니라 마스크나 threshold의 임계값, 픽셀 연산 등 다양한 곳에서 활용됩니다.

 

cv::Scalar white(255, 255, 255);  // 흰색
cv::Scalar blue(255, 0, 0);       // 파란색 (BGR 순서)

 

Scalar를 사용하는 대표적인 함수들

Scalar는 주로 그리기 함수에서 색상 값을 전달할 때 사용됩니다.

대표적으로 cv::line(), cv::rectangle(), cv::circle(), cv::putText() 등의 함수에서 색상을 지정할 때 필수로 사용됩니다.

또한 cv::Mat::setTo()를 통해 전체 이미지 또는 특정 영역의 색을 일괄 변경할 때도 활용됩니다.

 

cv::Mat img = cv::Mat::zeros(300, 300, CV_8UC3);
cv::rectangle(img, cv::Point(50, 50), cv::Point(250, 250), cv::Scalar(0, 255, 0), -1);  // 녹색 사각형 채우기

 

또한 이미지 전체를 특정 색으로 초기화하고 싶을 때도 매우 유용합니다

 

img.setTo(cv::Scalar(200, 200, 50));  // 밝은 노란 계열로 전체 초기화

 

Scalar와 Mat 연산의 관계

Scalar는 Mat 객체와 연산할 때 자동으로 브로드캐스팅되어 전체 픽셀에 적용됩니다.

예를 들어, 이미지에 일정한 값을 더하거나 빼는 등의 연산에 사용할 수 있습니다.

이 기능은 이미지 전체 밝기를 조절하거나, 특정 색상 성분만 조절하고 싶을 때 유용합니다.

cv::Mat image = cv::imread("sample.jpg");
cv::Mat brighter = image + cv::Scalar(30, 30, 30);  // 전체 밝기 증가

 

단, 연산 결과는 데이터 타입을 초과하지 않도록 주의해야 합니다.

8비트 이미지에서 255를 넘는 값은 잘리기 때문에 cv::convertTo()와 함께 사용하는 것이 좋을 수 있습니다.

 

Scalar를 이용해 특정 색상을 기준으로 마스크 이미지를 만드는 방법

OpenCV에서 특정 색상을 기준으로 마스크 이미지를 만들기 위해 Scalar와 inRange() 함수를 함께 사용합니다.

Scalar(lower)와 Scalar(upper)로 원하는 색상의 범위를 지정하고, inRange()로 해당 범위에 속하는 픽셀을 흰색(255), 나머지는 검정(0)으로 처리된 이진 마스크를 생성합니다.
예를 들어, 파란색 계열을 추출하려면 다음과 같이 작성합니다

 

cv::inRange(img, cv::Scalar(100, 0, 0), cv::Scalar(255, 100, 100), mask);

 

HSV 색공간을 사용하면 더 정밀한 색 추출이 가능하며, 마스크는 후처리(모자이크, 추적 등)에 활용됩니다.

Scalar의 유연한 확장성과 활용 팁

Scalar는 최대 4개의 double 타입 값을 저장할 수 있어 색상 외에도 다양한 값을 담는 데 사용할 수 있습니다.

예를 들어 알파 채널(투명도) 값을 추가하거나, 마스크 연산에 임계값을 표현할 수도 있습니다.

또한 Scalar를 로그용 출력이나 디버깅 시에도 자주 활용합니다.

 

cv::Scalar s = cv::mean(image);  // 전체 이미지의 평균 색상 계산
std::cout << "Mean color (BGR): " << s << std::endl;

 

이처럼 Scalar는 단순한 색상 표현을 넘어서 OpenCV의 다양한 기능을 연결하는 유연한 데이터 컨테이너 역할을 합니다.

실전에서는 색상 조정, 마스크 기반 연산, 텍스트 스타일링 등 다양한 부분에서 Scalar의 강점을 활용할 수 있습니다.