ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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])는 직선의 끝점이다.

     

Designed by Tistory.