findContours() 함수로 객체의 외곽선을 찾고, 검출된 외곽선을 drawContours() 함수로 그리는 예제 프로그램 소스 코드를 코드 12-3에 나타냈습니다. 코드 12-3의 contours_basic() 함수는 이진 입력 영상에서 모든 외곽선을 찾아 각기 다른 색상으로 외곽선을 그립니다. contours_basic() 함수가 정의된 소스 파일과 사용된 영상 파일은 내려받은 예제 파일 중 ch10/findcts 프로젝트에서 확인할 수 있습니다.
코드 12-3 외곽선 검출과 그리기 [ch10/findcts]
01 void contours_basic() 02 { 03 Mat src = imread("contours.bmp", IMREAD_GRAYSCALE); 04 05 if (src.empty()) { 06 cerr << "Image load failed!" << endl; 07 return; 08 } 09 10 vector<vector<Point>> contours; 11 findContours(src, contours, RETR_LIST, CHAIN_APPROX_NONE); 12 13 Mat dst; 14 cvtColor(src, dst, COLOR_GRAY2BGR); 15 16 for (int i = 0; i < contours.size(); i++) { 17 Scalar c(rand() & 255, rand() & 255, rand() & 255); 18 drawContours(dst, contours, i, c, 2); 19 } 20 21 imshow("src", src); 22 imshow("dst", dst); 23 24 waitKey(0); 25 destroyAllWindows(); 26 }
• 3행 contours.bmp 파일을 그레이스케일 형식으로 불러와 src에 저장합니다. contours.bmp는 픽셀 값이 0과 255로 구성된 이진 영상입니다.
• 10~11행 src 영상으로부터 모든 외곽선을 검출합니다. 외곽선의 계층 정보는 추출하지 않습니다.
• 13~14행 src 영상을 3채널 컬러 영상으로 변환하여 dst에 저장합니다.
• 16행 전체 외곽선 개수만큼 for 반복문을 수행합니다.
• 16~19행 contours에 저장된 각각의 외곽선을 임의의 색상으로 그립니다.