더북(TheBook)

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 영상 위에 빨간색 직선으로 그립니다.