-
HoughLines를 이용한 직선 감지 코드컴공지식/컴퓨터비전 2024. 9. 25. 23:37
int main() {
Mat image, edge, result;
float rho, theta, a, b, x0, y0;
Point p1, p2;
vector<Vec2f> lines; // 직선을 저장할 벡터
image = imread("chess_pattern.png"); // 이미지 불러오기
result = image.clone(); // 원본 이미지를 복사하여 결과 저장
cvtColor(image, image, CV_BGR2GRAY); // 컬러 이미지를 그레이스케일로 변환
Canny(image, edge, 50, 200, 3); // Canny 엣지 검출 수행
// Hough 변환을 이용해 직선 감지
// edge: 입력 엣지 이미지, lines: 직선을 저장할 벡터
// 1: rho의 해상도 (픽셀 단위)
// CV_PI/180: theta의 해상도 (라디안 단위)
// 150: accumulator에서 직선을 인식하기 위한 임계값
HoughLines(edge, lines, 1, CV_PI / 180, 150, 0, 0);
// 감지된 직선을 그리기
for (int i = 0; i < lines.size(); i++) {
rho = lines[i][0]; // 직선의 rho 값
theta = lines[i][1]; // 직선의 theta 값
a = cos(theta); // cos(theta) 계산
b = sin(theta); // sin(theta) 계산
x0 = a * rho; // 직선의 x 좌표 계산
y0 = b * rho; // 직선의 y 좌표 계산
// 직선의 두 점 계산
p1 = Point(cvRound(x0 + 1000 * (-b)), cvRound(y0 + 1000 * a)); // 첫 번째 점
p2 = Point(cvRound(x0 - 1000 * (-b)), cvRound(y0 - 1000 * a)); // 두 번째 점
// 직선을 그리기 (파란색, 두께 3)
line(result, p1, p2, Scalar(0, 0, 255), 3, LINE_AA);
}
// 이미지 출력
imshow("Input image", image);
imshow("edge", edge);
imshow("Hough Transform", result);
waitKey(0); // 키 입력 대기
}일단 이미지를 cvtColor(image, image, CV_BGR2GRAY);를 이용해 BGR에서 GRAY로 바꾸고
Canny(image, edge, 50, 200, 3);
이 부분을 통해 엣지만 남기는 작업을 한다.
이제 이 코드의 하이라이트
HoughLines(edge, lines, 1, CV_PI / 180, 150, 0, 0);
이 HoughLines 함수는 이미지에서 직선을 감지하는 함수다.
그 이후에는 직선 그리기 파트고 line함수를 이용해 직선을 그린다.
'컴공지식 > 컴퓨터비전' 카테고리의 다른 글
HoughLines랑 HoughLinesP의 차이 (1) 2024.09.25 HoughLinesP를 사용한 확률적 허프 변환 코드 (0) 2024.09.25 Canny 엣지 검출기 구현 (0) 2024.09.25 Sobel 엣지 검출기(Sobel Edge Detector) 구현 (0) 2024.09.25 엣지 픽셀(Edge pixels)과 엣지(Edges) (1) 2024.09.25