OpenCV에서 영상 내부 객체들의 외곽선을 검출하는 함수 이름은 findContours()입니다. 이 함수는 외곽선들의 계층 정보를 받아 오는 hierarchy 인자가 있는 형태와 없는 형태 두 가지로 정의되어 있습니다. findContours() 함수 원형은 다음과 같습니다.
void findContours(InputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point()); void findContours(InputArray image, OutputArrayOfArrays contours, int mode, int method, Point offset = Point()); |
|
• image |
입력 영상. 8비트 1채널 영상이어야 하고, 0이 아닌 픽셀을 객체로 취급합니다. 만약 mode가 RETR_CCOMP이면 CV_32SC1 타입의 영상을 지정할 수 있습니다. |
• contours |
검출된 외곽선 정보. vector<vector<Point>> 타입의 변수를 지정합니다. |
• hierarchy |
외곽선 계층 정보. vector<Vec4i> 타입의 변수를 지정합니다. |
• mode |
외곽선 검출 모드. RetrievalModes 열거형 상수를 지정합니다. |
• method |
외곽선 근사화 방법. ContourApproximationModes 열거형 상수를 지정합니다. |
• offset |
외곽선 점 좌표의 오프셋(이동 변위) |
findContours() 함수의 입력 영상으로는 보통 threshold() 등 함수에 의해 만들어진 이진 영상을 사용합니다. 실제 동작할 때는 입력 영상에서 픽셀 값이 0이 아니면 객체로 간주하여 외곽선을 검출합니다. contours 인자에는 검출된 외곽선 좌표 정보가 저장되고, 보통 vector<vector<Point>> 타입의 변수를 지정합니다. hierarchy 인자에는 검출된 외곽선의 계층 정보가 저장되고, 보통 vector<Vec4i> 타입의 변수를 지정합니다. Vec4i 클래스는 int 자료형 네 개를 저장할 수 있는 OpenCV 벡터 클래스입니다. i번째 외곽선에 대해 hierarchy[i][0]에는 다음 외곽선 번호, hierarchy[i][1]에는 이전 외곽선 번호, hierarchy[i][2]에는 자식 외곽선 번호, hierarchy[i][3]에는 부모 외곽선 번호가 저장됩니다. 만약 계층 구조에서 해당 외곽선이 존재하지 않으면 -1이 저장됩니다.