해당 포스팅은 OpenCV 4로 배우는 컴퓨터 비전과 머신러닝 (황선규 저)를 보고 공부하며 개인적인 용도를 위해 정리한 글이다.
마스크 연산
영상 (프레임), 이미지 등의 일부 영역에 대해서만 특정 연산을 수행하는 것.
주로 영상을 그레이스케일로 변환한 뒤 연산한다.
setTo
operator::Mat.setTo(마스크 값, 마스크 행렬);
의 형태
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "opencv2/opencv.hpp"
int main(void)
{
cv::Mat src = cv::imread("lenna.bmp", cv::IMREAD_COLOR);
cv::Mat mask = cv::imread("mask_smile.bmp", cv::IMREAD_GRAYSCALE);
src.setTo(cv::Scalar(0, 255, 255), mask);
cv::imshow("debug", src);
cv::waitKey();
cv::destroyAllWindows();
return 0;
}
lenna.bmp
에mask_smile.bmp
영역을 합성한다.
copyTo
- 복사 할 행렬만 전달하면 단순 행렬 복사한다.
- 복사 할 행렬과 마스크 연산을 입력으로 받으면 마스크 연산을 수행한다.
- 마스크 영역의 행렬값들을
dst
행렬로 복사한다.- 마스크 영역에 있는 값들은 $0$ 혹은 $255$ 이며
copyTo
를 통해 $0$이 아닌 값들만dst
행렬로 복사한다. - $0$이 아닌 위치의 값들만 복사 되었기 때문에 해당 영역의 그람만 합성 된다.
- 마스크 영역에 있는 값들은 $0$ 혹은 $255$ 이며
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "opencv2/opencv.hpp"
int main(void)
{
cv::Mat src = cv::imread("airplane.bmp", cv::IMREAD_COLOR);
cv::Mat mask = cv::imread("mask_plane.bmp", cv::IMREAD_GRAYSCALE);
cv::dst = cv::imread("field.bmp", cv::IMREAD_COLOR);
src.copyTo(dst, mask);
cv::imshow("debug", dst);
cv::waitKey();
cv::destroyAllWindows();
}
airplane.bmp
의 비행기 영역을 지정 ($0$이 아닌 값의 위치)하여 마스크를 생성한 뒤 해당 영역의 행렬값만 복사하여field.bmp
에 합성한다.field.bmp
에airplane.bmp
의 비행기 영역의 값들이 복사 되어 합성 됨.