[OpenCV] ROI와 마스크, 사진 합성, 연산 시간 측정

zzwon1212·2023년 10월 26일
0

OpenCV

목록 보기
6/16
post-thumbnail

1. ROI와 마스크

  • ROI(Region of Interest)

    • 영상에서 특정 연산을 수행하고자 하는 부분 영역
  • 마스크

    • OpenCV는 일부 함수에서 ROI 연산을 지원하며, 이때 마스크 영상(mask image)을 인자로 함께 전달해야 한다. (e.g. copyTo(), calcHist(), bitwise_or(), matchTemplate(), etc.)
    • 마스크 영상은 CV_8UC1 타입(그레이스케일)
    • 마스크 영상의 픽셀값이 0이 아닌 위치에서만 연산이 수행된다. 보통 0 또는 255로 구성된 이진 영상(binary image)을 사용한다.
  • 연관 함수

    • 픽셀 값 복사 함수

      void Mat::copyTo(InputArray m, InputArray mask) const;
      • m: 출력 영상. 만약 *this와 크기 및 타입이 같은 m을 입력으로 지정하면, m을 새로 생성하지 않고 연산을 수행함. 그렇지 않으면 m을 새로 생성하여 연산을 수행한 후 반환함.
      • mask: 마스크 영상. CV_8U. 0이 아닌 픽셀에 대해서만 복사 연산을 수행.
    • 픽셀 값 복사 함수(전역 함수)

      void Mat::copyTo(InputArray src, OutputArray dst, InputArray mask) const;
      • mask: 마스크 영상. CV_8U. 0이 아닌 픽셀에 대해서만 복사 연산을 수행.

2. 마스크를 이용한 사진 합성

2.1. 예시 1

  • 아래 그림은 copyTo()mask 영상을 이용해 두 사진을 합성한 결과이다.

2.2. 예시 2

  • 아래 그림은 고양이 사진과 OpenCV 로고(PNG 파일)를 합성한 결과이다.
    • 합성하고자 하는 위치에서 로고의 크기만큼 사진을 crop한다.
    • 로고의 알파 채널을 이용해 마스크 영상과 트루컬러 영상을 만든다.
    • 로고 트루컬러 영상을 crop한 고양이 사진의 마스크 부분에 복사한다.
    • crop한 사진이 원본 고양이 사진의 crop 부분을 참조하기 때문에 원본 고양이 사진에도 복사가 반영된다.

3. 연산 시간 측정

  • 연산 시간은 Release 모드에서 측정해야 한다.

  • TickMeter 클래스

    • 클래스 내부에서 getTickCount()getTickFrequency() 함수를 조합해서 시간을 측정

    • 멤버 함수

      TickMeter; // 기본 생성자
      
      void start(); // 시간 측정을 시작할 때 사용
      void stop(); // 시간 측정을 멈출 때 사용
      void reset(); // 시간 측정을 초기화할 때 사용
      
      double getTimeMicro() const; // 연산 시간을 마이크로초 단위로 반환
      double getTimeMilli() const; // 연산 시간을 밀리초 단위로 반환
      double getTimeSec() const; // 연산 시간을 초 단위로 반환
    • 예제 코드

      TickMeter tm;
      tm.start();
      func1();
      tm.stop();
      cout << "func1(): " << tm.getTimeMilli() << "ms." << endl;
      
      tm.reset();
      
      tm.start();
      func2();
      tm.stop();
      cout << "func2(): " << tm.getTimeMilli() << "ms." << endl;

📙강의 - 황선규

profile
JUST DO IT.

0개의 댓글