-
HoughLinesP를 사용한 확률적 허프 변환 코드컴공지식/컴퓨터비전 2024. 9. 25. 23:40
이 방법은 직선 검출을 할 때 더 효율적이고, 직선의 시작점과 끝점을 직접 제공해주는 장점이 있다.
int main() {
Mat image, edge, result;
vector<Vec4i> lines; // 직선의 시작점과 끝점을 저장할 벡터
image = imread("chess_pattern.png"); // 이미지 불러오기
result = image.clone(); // 원본 이미지를 복사하여 결과 저장
cvtColor(image, image, CV_BGR2GRAY); // 컬러 이미지를 그레이스케일로 변환
Canny(image, edge, 50, 200, 3); // Canny 엣지 검출 수행
// 확률적 허프 변환을 이용해 직선 감지
// edge: 입력 엣지 이미지, lines: 직선을 저장할 벡터
// 1: rho의 해상도 (픽셀 단위)
// CV_PI/180: theta의 해상도 (라디안 단위)
// 50: accumulator에서 직선을 인식하기 위한 임계값
// 10: 최소 직선 길이
// 300: 같은 직선 상에서 점들 간의 최대 허용 간격
HoughLinesP(edge, lines, 1, CV_PI / 180, 50, 10, 300);
// 감지된 직선을 그리기
for (int i = 0; i < lines.size(); i++) {
Vec4i l = lines[i]; // 직선의 시작점과 끝점을 저장
line(result, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 3, LINE_AA); // 직선을 이미지에 그리기
}
// 이미지 출력
imshow("Input image", image);
imshow("edge", edge);
imshow("Hough Transform", result);
waitKey(0); // 키 입력 대기
}여기서 중요하게 볼 항목은 HoughLinesP(edge, lines, 1, CV_PI / 180, 50, 10, 300); 이다.
HoughLinesP는 확률적 허프 변환을 사용하는 함수로, 직선의 시작점과 끝점을 정확히 찾아준다.
그리고 lines 벡터에 저장된 각 직선의 시작점과 끝점을 가져와서 line 함수를 사용해 직선을 그린다.
Point(l[0], l[1])는 시작점이고 Point(l[2], l[3])는 직선의 끝점이다.
'컴공지식 > 컴퓨터비전' 카테고리의 다른 글
Global Thresholding이란 (1) 2024.10.02 HoughLines랑 HoughLinesP의 차이 (1) 2024.09.25 HoughLines를 이용한 직선 감지 코드 (0) 2024.09.25 Canny 엣지 검출기 구현 (0) 2024.09.25 Sobel 엣지 검출기(Sobel Edge Detector) 구현 (0) 2024.09.25