길고긴 여정을 끝냈다...라고 안도 할 때쯤 이건 새발의 피 라는걸 동시에 느꼈다.
이거는 정말 base중에 base라는 말을 듣고 그래도 기초는 끝냈다라는 것에 기쁨을 느끼며 마지막 총정리를 하고 프로젝트로 넘어가자
이미지를 불러와 gray scale로 변환시킨다. (edge을 찾기 위한 가공처리)
kernal _size 얼마의 픽셀 값으로 블러셔 할 것인지.
가우시안 필터로 gray scale에 사진을 (몇 대 몇(픽셀 값))으로 블러셔 할 것인지. sigma는 0으로 맞춰 노이즈 제거에만 초점을 둔다.
low_threshold = 임계값 1.
- 임계값 1 이하에 포함된 가장자리는 가장자리에서 제외하고
high_threshold = 임계값 2
- 임계값 2 이상에 포함된 가장자리는 가장자리로 간주하고 임계값 2는 임계값 1보다 3배 정도 작아야 한다. (깔끔히 나옴)
즉 80 이하에 가장자리는 가장자리로 포함하지 않고 240 이상에 가장자리는 가장자리로 간주한다. (그 사이는 잔선으로 처리되는 것 같음)
가공 처리된 image인 blur_gray에서 Canny를 사용해 edges 찾는다.
rho = 픽셀 크기
theta = 기울기
np.array는 빈 공간
min_line_length = 이 값 이하로 주어진 선 길이는 찾고자 하는 직선으로 간주하지 않는다.
max_linethmax_line_gap = 찾은 직선이 이 값 이상 떨어져 있으면 다른 직선으로 간주한다.
line_image = np.copy(image)*0 곱하기 0은 RGB로 black을 의미한다.
threshold = 서로 일직선 위에 있는 점의 수가 threshold 개수 이상인지 아닌지를 판단하는 척도와 같은 것이다. 값이 작으면 그만큼 기준이 많아져 많은 직선이 검출될 것이고 , 값을 높게 정하면 그만큼 적지만 확실한 직선들만 검출될 것이다.
HoughLinesP는 output에서 선분의 시작점과 끝점에 대한 좌표값을 출력하고 그렇기 때문에 함수 안에서 선의 최소 길이라든지, 점 사이의 최대 간격을 설정해야 하는 것이다.
검은색 사진(line_image)에 HoughLinesP에 라인을 그린다. 빨간색에 굵기 10으로.
따로 지정해 둔 부분이 없는데 왜 저 차선만 선이 그어져있을까. 그건바로 max_line gap ,threshold, min_line_length 때문이다.
threshold로 잔 선들을 후보에서 제외 시키고 min으로 길이 100 이하에 직선들을 제거한다음 max으로 확실한 선을 찾는다
이중에서도 min길이가 핵심인것같다 (이 만큼 긴 선은 차선 하나밖에 없으니)
또 다른 궁금증, 왜 굳이 원본 이미지를 copy한 다음 검정색으로 만든 후 그 위에 선을 그릴까 (edges를 이용해서)
그냥 바로 edges위에 그리면 되는것 아닌가? 라는 의문이 들어서 바로 실험해보았다 .
결과적으론 되긴된다. 하지만 색깔이 gray scale과 blur를 거쳐서 그런지 선 색이 노란색이거 바탕이 약간 푸른빛이 돌고 좀 불투명하다. 그래서 원본 카피를 만든 후 두 이미지를 겹치는것 같다.
dstack = 세 번째 축을 따라 배열을 쌓을 것이다.(?)
masked_edges 이미지를 line_image와 합치기 위해서 masked_edges를 binary (이진수) 사진으로 변환한다.
line_image는 이미 HoughLinesP 를 통해 array형식으로(일단 array가 있으니)으로 된 것같고 edges는 원본과 다른 사진이기 때문에 dstack을 사용하는 것 같다
line_image는 점으로 되어있다. 이 코드는 무엇을 뜻하나 싶어서 주석 처리하고 실행해봤는데 이 코드 없이도 잘 돌아가던데..?
두 사진은 array로 합쳐지는데 print((type())을 이용하여 각 사진의 타입을 봤더니 array다.
그래서 np.dstack 없이도 잘 돌아가는 것 같다. 좀더 확실하게 하려고 하는건가..?
addWeighted로 두 사진을 합친다. color_edges와 line_image를 합친다.
0.8과 1은 각각 그 앞에 있는 image 1과 image 2의 투명도를 조절한다. 맨 뒤에 0은 사진 전체에 투명도를 의미한다.
***핵심은 lines 즉 cv2.HoughLinesP와 for line in lines로 edges에서에 선 조절이었던 것 같다***
이제 드디어 project를 들어가는데 설레면서도 두려운 공부 안 하는 학생이였습니다.
'IT 프로그래밍 > Python 파이썬' 카테고리의 다른 글
Python Trapping Rain Water 풀이 + 해석 (0) | 2020.10.15 |
---|---|
Machine learning 머신러닝이란 - 1 (+영어) (0) | 2020.10.14 |
cv2.HoughLinesP(edges,rho,theta,threshold,np.array([]),min_line_length,max_line_gap) (0) | 2020.10.04 |
Gaussian 가우시안 필터 openCV (0) | 2020.10.03 |
Canny Edge openCV, python (1) | 2020.10.03 |