HoughLinesP() 함수를 사용하여 직선을 검출하는 예제 코드를 코드 9-4에 나타냈습니다. 코드 9-4에 나타난 hough_line_segments() 함수의 구성은 앞서 소개한 코드 9-3의 hough_lines() 함수와 거의 유사합니다. 다만 HoughLinesP() 함수는 검출한 직선의 시작점과 끝점의 좌표를 반환하기 때문에 검출된 직선을 그리는 코드가 훨씬 간단합니다. hough_line_segments() 함수가 정의된 소스 파일은 내려받은 예제 파일 중 ch09/hough 프로젝트에서 확인할 수 있습니다.
코드 9-4 확률적 허프 변환 선분 검출 예제 [ch09/hough]
01 void hough_line_segments() 02 { 03 Mat src = imread("building.jpg", IMREAD_GRAYSCALE); 04 05 if (src.empty()) { 06 cerr << "Image load failed!" << endl; 07 return; 08 } 09 10 Mat edge; 11 Canny(src, edge, 50, 150); 12 13 vector<Vec4i> lines; 14 HoughLinesP(edge, lines, 1, CV_PI / 180, 160, 50, 5); 15 16 Mat dst; 17 cvtColor(edge, dst, COLOR_GRAY2BGR); 18 19 for (Vec4i l : lines) { 20 line(dst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 2, LINE_AA); 21 } 22 23 imshow("src", src); 24 imshow("dst", dst); 25 26 waitKey(0); 27 destroyAllWindows(); 28 }
• 3행 building.jpg 영상을 그레이스케일 형식으로 불러와 src에 저장합니다.
• 11행 캐니 에지 검출기를 이용하여 구한 에지 영상을 edge에 저장합니다.
• 13~14행 HoughLinesP() 함수를 이용하여 모든 직선 성분의 시작점과 끝점 좌표를 구합니다.
• 17행 그레이스케일 에지 영상 edge를 BGR 3채널 컬러 영상으로 변환하여 dst에 저장합니다.
• 19행 HoughLinesP() 함수에 의해 구해진 모든 직선 성분을 dst 영상 위에 빨간색 직선으로 그립니다.