[OpenCV] ROI 지정하기

스윗포테이토·2022년 10월 26일
2

ROI

Region Of Interest, 직역하면 관심영역이라는 뜻이다.

영상처리를 하면서 ROI를 잡는 것은 굉장히 중요한데, 영상의 범위에 따라 연산속도가 좌지우지 되기 때문이다. 일반적으로 영상을 마스킹해서 처리한다.

원본 프레임과 마스킹 프레임이 필요하다. 원본 프레임은 말 그대로 원본이고, 마스킹 프레임은 관심 영역의 위치만 하얗게 표현한 프레임이다. 일반적으로 흑백 프레임이며, 자료형은 CV_8U를 많이 사용한다.

CV_8U: 8bit Unsigned int

마스크 생성

전체 100x100 픽셀에 마름모 모양 마스크를 생성해보자

vector<Point> roi = {
        {0, 50}, {50, 100}, {100, 50}, {50, 0}
};
Mat mask = Mat::zeros(100, 100, CV_8U);
fillPoly(mask, roi, Scalar(255));


(창 크기가 커서 그렇지 왼쪽 검정 영역만 보면 된다!)
이제 이 마스크를 사용하여 저 마름모 영역만 남겨보도록 하자.

크게 두 가지 방법이 있다.

Mat.setTo()


Mat 클래스의 멤버 함수를 이용하는 것이다. 이 함수는 mask에서 0이 아닌 위치를 찾아 original의 해당 픽셀을 value로 바꿔준다.

original.setTo(Scalar(255, 0, 0), mask); // 파란색으로 바꿔준다!

이를 활용하면, 원본 프레임에서 마름모 영역을 제외한 부분을 검정 색으로 칠해주면, 관심 영역만 남길 수 있다.

mask = ~mask // 마스크 반전 - 하얀 부분은 마름보 바깥 부분이 된다.
original.setTo(Scalar(255, 255, 255), mask); // 마스크의 흰 영역을 검정색 바꿔준다! - 결국 마름모 안쪽은 원본 그대로이고 나머지는 검정색 마스킹

이 방법은 마스크를 반전 시켜야 하는 번거로움이 있긴 하지만, mask의 자료형과 관계 없이 original의 자료형을 살려서 원하는 value 값을 설정할 수 있다는 장점이 있다.

bitwise_and()

좀 더 단순한 연산은 and 연산이다. 이 방법은 각 픽셀끼리 and 연산을 시키는 방법이다. 따라서 마스크는 남기고 싶은 픽셀의 데이터를 모두 1로 채워야 하고, 없애고 싶은 부분은 0으로 채워야 한다. 또한 비트 연산을 하기 때문에 originalmask의 채널 수가 동일해야 한다.

bitwise_and(original, mask, result);
profile
나의 삽질이 미래의 누군가를 구할 수 있다면...

0개의 댓글