해당 포스팅은 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의 비행기 영역의 값들이 복사 되어 합성 됨.






