133 lines
3.6 KiB
Python
133 lines
3.6 KiB
Python
import sys
|
|
import glob
|
|
import os
|
|
import glob
|
|
import numpy as np
|
|
import cv2
|
|
from PIL import Image
|
|
import pytesseract
|
|
import re
|
|
|
|
def clean2_plate(plate):
|
|
gray_img = cv2.cvtColor(plate, cv2.COLOR_BGR2GRAY)
|
|
|
|
_, thresh = cv2.threshold(gray_img, 110, 255, cv2.THRESH_BINARY)
|
|
#if cv2.waitKey(0) & 0xff == ord('q'):
|
|
# pass
|
|
num_contours,hierarchy = cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
|
|
|
|
if num_contours:
|
|
contour_area = [cv2.contourArea(c) for c in num_contours]
|
|
max_cntr_index = np.argmax(contour_area)
|
|
|
|
max_cnt = num_contours[max_cntr_index]
|
|
max_cntArea = contour_area[max_cntr_index]
|
|
x,y,w,h = cv2.boundingRect(max_cnt)
|
|
|
|
if not ratioCheck(max_cntArea,w,h):
|
|
return plate,None
|
|
|
|
final_img = thresh[y:y+h, x:x+w]
|
|
return final_img,[x,y,w,h]
|
|
|
|
else:
|
|
return plate,None
|
|
|
|
def ratioCheck(area, width, height):
|
|
ratio = float(width) / float(height)
|
|
if ratio < 1:
|
|
ratio = 1 / ratio
|
|
if (area < 1063.62 or area > 73862.5) or (ratio < 3 or ratio > 6):
|
|
return False
|
|
return True
|
|
|
|
def isMaxWhite(plate):
|
|
avg = np.mean(plate)
|
|
if(avg>=115):
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
def ratio_and_rotation(rect):
|
|
(x, y), (width, height), rect_angle = rect
|
|
|
|
if(width>height):
|
|
angle = -rect_angle
|
|
else:
|
|
angle = 90 + rect_angle
|
|
|
|
if angle>15:
|
|
return False
|
|
|
|
if height == 0 or width == 0:
|
|
return False
|
|
|
|
area = height*width
|
|
if not ratioCheck(area,width,height):
|
|
return False
|
|
else:
|
|
return True
|
|
|
|
|
|
#Detecting numberplate
|
|
def number_plate_detection(img):
|
|
img2 = cv2.GaussianBlur(img, (5,5), 0)
|
|
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
|
|
|
|
img2 = cv2.Sobel(img2,cv2.CV_8U,1,0,ksize=3)
|
|
_,img2 = cv2.threshold(img2,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
|
|
|
|
element = cv2.getStructuringElement(shape=cv2.MORPH_RECT, ksize=(17, 3))
|
|
morph_img_threshold = img2.copy()
|
|
cv2.morphologyEx(src=img2, op=cv2.MORPH_CLOSE, kernel=element, dst=morph_img_threshold)
|
|
num_contours, hierarchy= cv2.findContours(morph_img_threshold,mode=cv2.RETR_EXTERNAL,method=cv2.CHAIN_APPROX_NONE)
|
|
cv2.drawContours(img2, num_contours, -1, (0,255,0), 1)
|
|
|
|
|
|
for i,cnt in enumerate(num_contours):
|
|
min_rect = cv2.minAreaRect(cnt)
|
|
if ratio_and_rotation(min_rect):
|
|
x,y,w,h = cv2.boundingRect(cnt)
|
|
plate_img = img[y:y+h,x:x+w]
|
|
if(isMaxWhite(plate_img)):
|
|
clean_plate, rect = clean2_plate(plate_img)
|
|
if rect:
|
|
fg=0
|
|
x1,y1,w1,h1 = rect
|
|
x,y,w,h = x+x1,y+y1,w1,h1
|
|
plate_im = Image.fromarray(clean_plate)
|
|
text = pytesseract.image_to_string(plate_im, lang='eng')
|
|
return text
|
|
|
|
|
|
|
|
print("HELLO!!")
|
|
print("Welcome to the Number Plate Detection System.\n")
|
|
|
|
array=[]
|
|
|
|
dir = os.path.dirname(__file__)
|
|
|
|
for img in glob.glob(dir+"/Images/*.jpeg") :
|
|
img=cv2.imread(img)
|
|
|
|
img2 = cv2.resize(img, (600, 600))
|
|
cv2.imshow("Image of car ",img2)
|
|
cv2.waitKey(1000)
|
|
cv2.destroyAllWindows()
|
|
|
|
|
|
number_plate=number_plate_detection(img)
|
|
res2 = str("".join(re.split("[^a-zA-Z0-9]*", number_plate)))
|
|
res2=res2.upper()
|
|
print(res2)
|
|
|
|
array.append(res2)
|
|
import pprint
|
|
pprint.pprint(array)
|
|
img = cv2.imread("./Search_Image/Car.jpeg")
|
|
number_plate=number_plate_detection(img)
|
|
import pdb; pdb.set_trace()
|
|
res2 = str("".join(re.split("[^a-zA-Z0-9]*", number_plate)))
|
|
|
|
print("The car number is:- ",res2)
|