자율주행

Windows10 Anaconda Jupyter OpenCV 기초사용법 II(findContours)

coding art 2022. 8. 29. 20:30
728x90

테트리스 6조각으로 이루어진 tetris.png를 다운받아 Tetris.ipynb와 같은 폴더에 넣어 실행시켜보자. 

tetris.png
0.04MB

tetris.png 이미지 파일을 블로그 끝에 첨부된 Tetris.ipynb 파일을 다운받아 사용자 폴더에 위치 시킨 후 Anaconda Navigator basic에서 Jupyter를 실행시키자.

 

첫 번째 셀에서 OpenCV, imutils, matplotlib 라이브러리를 import 하자. matplotlib 는 그래프 작성이 아니라 이미지 처리 결과를 inline 출력하는데 사용된다. inline 출력은 셀 실행 후 아랫 부분의 출력 난에 출력함을 뜻하며 documentation에 편리하다.

 

이미지를 BGR 상태에서 GRAY 상태로 변환하여 inline 출력해 보자. 분명히 흑백 이미지가 나와야 하는데 컬러 상태로 출력 되었다. matplotlib 세부 설정이 필요할 수도 있을 것이다. 하지만 이어지는 Edge (윤곽선) 검출은 병 이상이 없이 실행이 가능하다.

 

 

이 처리 내용이 불만족스럽다면 inline 출력 대신 아래의 코드를 실행시켜 윈도우즈10 바탕화면에 출력해보자. 생각했던대로 흑백 이미지 출력이 가능하다.

 

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

cv2.imshow("Gray", gray)

cv2.waitKey(0)

 

OpenCV 의 Canny 명령에서 밝기 범위를 조절하여 객체들의 윤곽를 추출해보자. 이 Canny 명령은 ADAS(Advanced Driver Assistance Systems)에서 중앙선이나 차선 추출에 사용됨에 유의하자.

 

 

임계치(threshold)를 적용할 객체들은 이미 흑백(gray)이미지로 처리되어 있어야 한다. 객체의 모든 픽셀에 대해 동일한 임계값을 적용하자. 배경은 흰색이므로 255 이며 객체들은 회색이므로 225 ~255 사이로 임계값을 설정하자. 최종출력은 역 즉 Inverse를 취하도록 한다. 배경 흰색은 검은색으로 회색조는 거의 흰색으로 처리된다.

 

 

임계치 처리된 (thresholded) 이미지에 포함된 객체들dptj cv2.findContours 명령을 사용하여 contour들을 찾아내자. contour는 직선이나 곡선일 수 있으며 항상 폐곡선으로 닫혀 있어야 한다. 이 명령은 이어지는 cv2.drawContours 명령과 함께 이미지에 포함된 객체의 윤곽을 잡아내는 대단히 중요한 명령이다.

 

 

앞 셀에서 처리한 thresh 의 사본 이미지 즉 thresh.copy()를 사용하자. cv2.RETR_EXTERNAL 플래그는 객체의 가장 바깥쪽 contour를 찾아서 가져 온다는 의미이다.

 

cv2.CHAIN_APPROX_SIMPLE은 contour가 직선으로 이루어질 경우 양 끝점 데이터만 기억하면 된다는 의미이며 SIMPLE 대신 NONE으로 처리하면 모든 contour 상의 점 데이터들을 기억한다는 의미이다.

 

이어서 imutils 라이브러리의 grab_contours 명령을 사용하여 찾아낸 contour를 모두 붙잡아둔다.

 

contour를 작도할 수 있도록 원 이미지의 사본을 준비한다.

 

for loop에서 imutils에서 붙잡아둔 contour 데이터를 [c]에 의해 리스트화 해서 cv2.drawContours 명령으로 작도할 수 있도록 인수로 제공한다.

 

Contour 작도가 끝난 후 이미지에서 찾아낸 객체의 수를 cv2.putText 명령을 사용하여 “text” 형태로 출력하자.

 

 

첨부된 Jupyter 코드 Tetris.ipynb 를 다운받자.