ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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함수를 이용해 직선을 그린다.

     

Designed by Tistory.