Home OpenCV 마스크 연산
Post
Cancel

OpenCV 마스크 연산

해당 포스팅은 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

mask_smile

lenna_result

  • lenna.bmpmask_smile.bmp 영역을 합성한다.

copyTo

  • 복사 할 행렬만 전달하면 단순 행렬 복사한다.
  • 복사 할 행렬과 마스크 연산을 입력으로 받으면 마스크 연산을 수행한다.
  • 마스크 영역의 행렬값들을 dst 행렬로 복사한다.
    • 마스크 영역에 있는 값들은 $0$ 혹은 $255$ 이며 copyTo를 통해 $0$이 아닌 값들만 dst 행렬로 복사한다.
    • $0$이 아닌 위치의 값들만 복사 되었기 때문에 해당 영역의 그람만 합성 된다.
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

mask_airplane

field

airplane_result

  • airplane.bmp의 비행기 영역을 지정 ($0$이 아닌 값의 위치)하여 마스크를 생성한 뒤 해당 영역의 행렬값만 복사하여 field.bmp에 합성한다.
  • field.bmpairplane.bmp의 비행기 영역의 값들이 복사 되어 합성 됨.
This post is licensed under CC BY 4.0 by the author.

OpenCV 파일 입출력

OpenCV 트랙바 생성