더북(TheBook)

코드 9-3 허프 변환 직선 검출 예제 [ch09/hough]

01    void hough_lines()
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<Vec2f> lines;
14        HoughLines(edge, lines, 1, CV_PI / 180, 250);
15     
16        Mat dst;
17        cvtColor(edge, dst, COLOR_GRAY2BGR);
18     
19        for (size_t i = 0; i < lines.size(); i++) {
20            float r = lines[i][0], t = lines[i][1];
21            double cos_t = cos(t), sin_t = sin(t);
22            double x0 = r * cos_t, y0 = r * sin_t;
23            double alpha = 1000;
24     
25            Point pt1(cvRound(x0 + alpha * (-sin_t)), cvRound(y0 + alpha * cos_t));
26            Point pt2(cvRound(x0 - alpha * (-sin_t)), cvRound(y0 - alpha * cos_t));
27            line(dst, pt1, pt2, Scalar(0, 0, 255), 2, LINE_AA);
28        }
29     
30        imshow("src", src);
31        imshow("dst", dst);
32     
33        waitKey(0);
34        destroyAllWindows();
35    }

 

3행 building.jpg 영상을 그레이스케일 형식으로 불러와 src에 저장합니다.

10~11행 캐니 에지 검출기를 이용하여 구한 에지 영상을 edge에 저장합니다.

13~14행 HoughLines() 함수를 이용하여 직선의 방정식 파라미터 ρθ 정보를 lines에 저장합니다. 축적 배열에서 ρ 간격은 1픽셀 단위로, θ는 1° 단위로 처리합니다.

17행 그레이스케일 에지 영상 edge를 BGR 3채널 컬러 영상으로 변환하여 dst에 저장합니다.

19행 HoughLines() 함수에 의해 구해진 직선의 개수만큼 for 반복문을 수행합니다.

20~26행 직선의 방정식 파라미터 중에서 ρ를 변수 r에, θ를 변수 t에 저장합니다. x0y0는 원점에서 직선에 수선을 내렸을 때 만나는 점의 좌표입니다. pt1pt2에는 (x0, y0)에서 충분히 멀리 떨어져 있는 직선상의 두 점 좌표가 저장됩니다.

27행 검출된 직선을 두께가 2인 빨간색 실선으로 그립니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.