※파이선 코딩 초보자를 위한 텐서플로우∙OpenCV 머신 러닝 2차 개정판 발행
http://blog.daum.net/ejleep1/1175
OpenCV를 사용하여 자동차 번호판 인식을 위한 예제코드를 살펴보자, 자동차 번호판 문자열 인식을 위한 알고리듬이 많겠지만 그 중에서도 간단한 번호판의 4 코너를 찾는 알고리듬을 사용하기로 한다. 아울러 차량의 측면에서 번호판을 찍되 그 문자열의 원근이 그다지 심하지 않은 경우를 대상으로 하자.
특히 차량 속도가 빠른 도로에서 사용할 수 있기 위해서는 코드의 알고리듬이 단순하며 처리 속도가 빠를수록 유리할 것이다. 이 예제는 아래의 url 사이트 내용을 참조하였다.
License Plate Recognition using OpenCV in Python
https://www.codespeedy.com/license-plate-recognition-using-opencv-in-python/
헤더 영역에서 필요한 라이브러리는 cv2, imutils, numpy, Image 및 pytesseract 이다. 마지막의 pytesseract 는 반드시 사용자가 그 경로를 정확히 알아 지정해 주어야 한다.
이미지 파일을 읽어서 파일의 해상도를 확인 출력 후 다시 이미지의 가로 해상도 값을 500 으로 설정하자. 비전 Edge 처리를 위해서 흑백영상으로 변환하고 널은 면적에 나타나는 컬러 노이즈를 제거할 수 있도록 blurring 필터 작업을 실행한다. 3-~200 사이의 밝기가 변하는 구간을 대상으로 Canny Edge 처리한다.
아래 사진의 Canny Edge 처리 결과를 살펴보자. 특히 어둔 부분은 Edge 처리가 되지 않는다. 자동차 번호판은 차량 시동 거는 시점에서 항상 번호판 등이 켜지므로 주야에 상관 없이 밝기가 밝은 영역으로서 Canny Edge 처리가 가능하다.
번호판을 인식하기 위해서는 Canny Edge 처리된 이미지를 대상으로 Contour(폐곡선)들을 찾아서(find) 모조리 작도(draw)한다.
몇 개의 Contour 가 발견될지는 알 수 없으나 의외로 그 수는 많다. 그 중에서 경험적으로 면적 기준으로 큰 순서대로 30개를 작도하도록 한다. 물론 번호판도 포함되어 있어야 한다.
30개의 Contour를 대상으로 정확하게 4개의 코너를 가지는 Edge Contoure를 찾는 간결한 알고리듬이다.
찾아낸 사각형 Contour를 Crop 작업에 의해서 잘라내고 마지막으로 Tesseract-OCR 라이브러리를 사용하여 문자열을 추출한다.
자동차 번호판 문자열 추출 작업에서 차량 번호판을 카메라로 찍는 각도에 따라 번호판 문자열에 원근감이 생길 수도 있는데 이런 경우에는 Tesseract 루틴으로 문자열 추출이 불가능하다는 점에 유의하자.
#Canny_car_plate_01.py
import imutils
import cv2
import numpy as np
import pytesseract
from PIL import Image
pytesseract.pytesseract.tesseract_cmd = 'C:/Users/Ysc/AppData/Local/Tesseract-OCR/tesseract.exe'
image = cv2.imread("carplate7.jpg")
(h, w, d) = image.shape
print("width={}, height={}, depth={}".format(w, h, d))
cv2.imshow("Image", image)
img = imutils.resize(image, width=500 )
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #convert to grey scale
gray = cv2.bilateralFilter(gray, 11, 17, 17) #Blur to reduce noise
edged = cv2.Canny(gray, 30, 200)
cv2.imshow("Canny",edged)
cnts,new = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
img1=img.copy()
cv2.drawContours(img1,cnts,-1,(0,255,0),3)
cv2.imshow("img1",img1)
cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:30]
screenCnt = None #will store the number plate contour
img2 = img.copy()
cv2.drawContours(img2,cnts,-1,(0,255,0),3)
cv2.imshow("img2",img2) #top 30 contours
count=0
idx=7
# loop over contours
for c in cnts:
# approximate the contour
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.018 * peri, True)
if len(approx) == 4: #chooses contours with 4 corners
screenCnt = approx
x,y,w,h = cv2.boundingRect(c) #finds co-ordinates of the plate
new_img=img[y:y+h,x:x+w]
cv2.imwrite('./'+str(idx)+'.png',new_img) #stores the new image
idx+=1
break
#draws the selected contour on original image
cv2.drawContours(img, [screenCnt], -1, (0, 255, 0), 3)
cv2.imshow("Final image with plate detected",img)
Cropped_loc='./7.png' #the filename of cropped image
cv2.imshow("cropped",cv2.imread(Cropped_loc))
text=pytesseract.image_to_string(Cropped_loc,lang='kor', config='') #converts image characters to string
print("Number is:" ,text)
cv2.waitKey(0)
cv2.destroyAllWindows()
'머신러닝' 카테고리의 다른 글
공기정화식물 Keraslens Fresh/Wilt 구글 Colab에서 머신 러닝 (0) | 2020.08.06 |
---|---|
자동차 번호판 문자열 인식을 위한 Tesseract_OCTR 라이브러리 설치 (0) | 2020.08.06 |
Keras 에 의한 CIFAR-10 구글 Colabo GPU 처리 (0) | 2020.06.09 |
7-18 Haarcascade 특징추출(Feature Extraction) 원리와 드로우잉 스케치 OpenCV AI 안면인식 (0) | 2020.04.17 |
2-18 Fashion MNIST 텐서플로우 머신 러닝 Simple 네트워크 예제 (0) | 2020.02.27 |