본문 바로가기
프로그래밍/OpenCV

OpenCV, C++ ] setTo(), copyTo() 함수와 마스크 연산

by eteo 2022. 8. 18.
반응형

 

OpenCV 일부 함수에서는 ROI 설정을 위한 mask 연산을 지원한다. mask 연산은 영상 처리에서 특정 부분만 선택적으로 연산을 적용하고자 할 때 유용하게 사용된다.

 

mask 연산이란?

mask 연산은 소스 영상의 각 픽셀에 대해 연산을 수행할지 말지를 결정하는 이진 이미지를 사용하는 방식이다. 일반적으로 mask 영상은 Grayscale(흑백) 영상으로, 픽셀 값이 0이면 연산을 수행하지 않고, 0이 아닌 값(보통 255)이면 연산을 수행하게 된다. 이 방식을 통해 전체 이미지가 아닌 특정 영역에만 필터링, 복사, 색상 변경 등을 적용할 수 있다.

 

마스크 영상을 이용한 픽셀 값 설정

void mask_setTo() {

	Mat src = imread("lenna.bmp", IMREAD_COLOR);
	Mat mask = imread("mask_smile.bmp", IMREAD_GRAYSCALE);

	if (src.empty() || mask.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	src.setTo(Scalar(0, 255, 255), mask);

	imshow("src", src);
	imshow("mask", mask);

	waitKey(0);
	destroyAllWindows();
}

 

mask 영상에서 픽셀 값이 0이 아닌 위치에서만, src 영상 픽셀을 노란색(0, 255, 255)로 설정한다.

 

 

setTo()

setTo()는 입력된 값으로 전체 행렬의 값을 설정하는 함수다. 하지만 마스크가 주어지면, 마스크에서 0이 아닌 값이 있는 위치에서만 값이 설정된다.

Mat& Mat::setTo(InputArray value, InputArray mask = noArray());
  • value: 설정할 픽셀 값 (Scalar 형태)
  • mask: 적용할 영역을 지정하는 마스크 영상

 

 

 

마스크 영상을 이용한 픽셀 값 복사

 

void mask_copyTo() {

	Mat src = imread("airplane.bmp", IMREAD_COLOR);
	Mat mask = imread("mask_plane.bmp", IMREAD_GRAYSCALE);
	Mat dst = imread("field.bmp", IMREAD_COLOR);

	if (src.empty() || mask.empty() || dst.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	src.copyTo(dst, mask);

	imshow("src", src);
	imshow("mask", mask);
	imshow("dst", dst);

	waitKey(0);
	destroyAllWindows();
}

 

 

copyTo()

copyTo()는 하나의 영상에서 다른 영상으로 내용을 복사하는 함수이며, 마스크가 주어지면 마스크의 값이 0이 아닌 영역만 복사된다.

void Mat::copyTo(OutputArray m, InputArray mask) const;
  • m: 복사 대상 행렬 (보통 배경 이미지)
  • mask: 복사할 영역을 지정하는 마스크 영상

 

 

예제 출처 : OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝

반응형