상세 컨텐츠

본문 제목

OpenCV lane_detection

coding/OpenCV

by golduny_zoo 2021. 4. 22. 03:35

본문

728x90

도로 위의 선 잡기 

1 . canny를 이용하여 사진의 엣지 표시

(canny를 실행하기 가장 최적인 그레이스케일과 블러처리를 먼저 처리 ) 

def canny_edge(image):
	# Grayscale
    gray_conversion = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # Gaussian 블러
    blur_conversion = cv2.GaussianBlur(gray_conversion,(5,5), 0)
    # Canny 엣지
    canny_conversion = cv2.Canny(blur_conversion, 50, 150)
    return canny_conversion

2.  RoI 잡아주기 

(도로위의 선만 잡아야하기 때문에 영역은 도로만 가져온다. 비트와이즈 연산을 이용하기 때문에 사진은 흑백으로)

def reg_of_interest(image):
    image_height = image.shape[0]
    polygons =np.array( [[ (200, image_height),(1100, image_height), (550,250)  ]])# 도로영역
    image_mask = np.zeros_like(image)
    cv2.fillPoly(image_mask, polygons, 255)
    masking_image = cv2.bitwise_and(image,image_mask)
    return masking_image

canny와 RoI가 동시에 실행한 모습

3. 선 찾기

확률허프로 주어진 이미지의 모양(선)을 찾는다.  

lines = cv2.HoughLinesP(roi_conversion, 1, np.pi/180, 100, minLineLength=40,maxLineGap=5)

4. 찾은 선을 이미지로 표시한다.

def show_lines(image, lines):
    lines_image = np.zeros_like(image)
    if lines is not None :
        for i in range(len(lines)):
            for x1,y1,x2,y2 in lines[i]:								
                cv2.line(lines_image,(x1,y1),(x2,y2),(255,0,0),10) #  선 색 , 선굵기
    return lines_image

5. 선이 많이 표시 되어있어, 선의 평균으로 만든 선을 이미지로 표시

def make_coordinates(image, line_parameters):
    slope, intercept = line_parameters
    y1 = image.shape[0]
    y2 = int(y1*(3/5))
    x1 = int ( (y1 - intercept) / slope )
    x2 = int ( (y2 - intercept) / slope )
    return np.array( [x1, y1 ,x2, y2] )

def average_slope_intercept(image, lines):
    left_fit = []
    right_fit = []
    for line in lines :
        x1, y1, x2, y2 = line.reshape(4)
        # 기울기와 y절편을 가져올 수 있다. 
        parameter = np.polyfit( (x1, x2),(y1,y2), 1 )
        slope = parameter[0]
        intercept = parameter[1]
        if slope < 0 :
            left_fit.append( (slope, intercept))
        else :
            right_fit.append( (slope, intercept))
    left_fit_avg =np.average(left_fit, axis= 0)
    right_fit_avg = np.average(right_fit, axis=0)
    left_line = make_coordinates(image, left_fit_avg)
    right_line = make_coordinates(image, right_fit_avg)

    return np.array( [[left_line, right_line]] )

다시 4번 함수 실행

 

6. 선이미지와 원본 합치기

combine_image = cv2.addWeighted(lanelines_image, 0.8, lines_image,1,1) # 비율

관련글 더보기