자율주행

OpenCV Hough Transform에 의한 차선 작도 VIII

coding art 2022. 9. 16. 23:46
728x90

내용을 읽은 후 첨부된 파일을 사용하여 실행해 본 후 GaussianBlur 기법 적용 효과와 파라메터 변경에 따른 휴변환 기법 적용 결과들에 대해 검토해 보자.

 

흑백 이미지를 Blur 필터링 처리 없이 직접 Canny 명령을 사용하여 edge들을 추출하여 Hough 변환을 적용해 보자. GaussianBlur 에 의한 필터링 처리 여부는 Canny 에 의한 edge 추출 작업에 영향을 크게 미치지만 본 예제에서는 직접 Canny 처리를 하는 대신 Threshold 파라메터를 슬라이더 바로 도입하여 이미지 화면의 노이즈 효과를 체크해 보기로 한다.

 

메인 코드에서 차선 이미지 img 를 읽고 그 사본을 떠 dst 로 두자. 아울러 이 메인 코드의 변수에 해당하는 img 와 dst를 함수 onTrackbarChange 내에서 사용할 수 있도록 global 명령을 사용하여 공유하자.

 

 

th1, th2 는 Canny 필터링을 위한 밝기 threshold의 상한과 하한값을 나타낸다.

Canny 필터링으로 추출된 직선형 edge 데이터를 사용하여 Hough 변환작업을 하자. (ρ, θ)로 표현되는 Hough 좌표 공간에서 2는 ρ 값을 뜻한다.

 

 HoughLinesP 에 의해 찾아낸 edge들의 직선은 좌표 (x1,y1) 과 (x2,y2) 를 사용하여 다음 사례에서처럼 리스트 구조로 표현된다.

 

휴 변환에 의해 찾아낸 edge 의 모든 직선들을 작도하자. cv2.line 의 인수 중 (0,0,255) 는 붉은 색을 의미하며 1 은 선굴기를 뜻한다.

 

 

메인 코드에서 함수 createTrackbar 명령을 사용하여 휴 변환에 의해 찾아낸 직선들이 작도된 원본 이미지 img 에 threshold 슬라이더를 설치하고 함수 onTrackbarChange 를 실행시킨다. key 값이 27 즉 ‘Esc’에 해당하면 break 하여 빠져 나온 후, OpenCV 그래픽 윈도우를 지운다.

 

threshold = 500에서 차선에 해당하는 직선 edge 들이 다수 검출되었다.

 

threshold = 407 의 경우 노이즈를 탄 edge 이미지를 볼 수 있다.

 

참조: Hough Transform with OpenCV

https://learnopencv.com/hough-transform-with-opencv-c-python/

다음 Github url 주소에서 코드를 다운받아 실행해 보자.

https://github.com/spmallick/learnopencv/tree/master/Hough-Transform

 

또는 아래에 첨부된 이미지 파일과 코드를 복사하여 실행시켜보자

lanes.jpg
0.04MB

# lane_detection.py

import cv2; import numpy as np

def onTrackbarChange(max_slider):
    global img; global dst; #global gray
    th1 = max_slider; th2 = 0.4 * th1
    edges = cv2.Canny(img, th1, th2)
    lines = cv2.HoughLinesP(edges, 2, np.pi/180.0, 100, minLineLength=10, maxLineGap=100)
    print(lines)
    
    for line in lines:
        x1,y1,x2,y2 = line[0]; cv2.line(dst, (x1,y1), (x2,y2), (0,0,255), 1)
        
    cv2.imshow("Multiple Lanes", img)
    cv2.imshow("Result Image", dst);cv2.imshow("Edges", edges)
    
    
if __name__ == "__main__":  
    
    img = cv2.imread("lanes.jpg")
    #img = cv2.imread("multilanes.jpg")
    dst = np.copy(img)
    #gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    cv2.namedWindow("Multiple Lanes"); cv2.namedWindow("Edges"); cv2.namedWindow("Result Image")
    
    initThresh = 500; maxThresh = 1000
    
    cv2.createTrackbar("threshold", "Result Image", initThresh, maxThresh, onTrackbarChange)
    onTrackbarChange(initThresh)
    
    while True:
        key = cv2.waitKey(1)
        if key == 27:
            break
    cv2.destroyAllWindows()