코드 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에 저장합니다. x0와 y0는 원점에서 직선에 수선을 내렸을 때 만나는 점의 좌표입니다. pt1과 pt2에는 (x0, y0)에서 충분히 멀리 떨어져 있는 직선상의 두 점 좌표가 저장됩니다.
• 27행 검출된 직선을 두께가 2인 빨간색 실선으로 그립니다.