You can detect car number plates with Python and OpenCV2. Because the number of visible possibilities for number plates are rather limited, it's very easy to do.
As with any Machine Learning program, data is king. First load the data
watch_cascade = cv2.CascadeClassifier('cascade.xml')
image = cv2.imread("car.jpg")
Loads the cascade file and input image. Any car image will do:
Copy the cascade file from here: Download cascade file
Then apply the cascade file to the image and find the plates. Run the program to find the number plate
Simple right?
The program has many more lines of code. But the general idea is to apply a cascade to find the plate object
#!/usr/bin/python3
#coding=utf-8
import cv2
watch_cascade = cv2.CascadeClassifier('cascade.xml')
image = cv2.imread("car.jpg")
def detectPlateRough(image_gray,resize_h = 720,en_scale =1.08 ,top_bottom_padding_rate = 0.05):
if top_bottom_padding_rate>0.2:
print("error:top_bottom_padding_rate > 0.2:",top_bottom_padding_rate)
exit(1)
height = image_gray.shape[0]
padding = int(height*top_bottom_padding_rate)
scale = image_gray.shape[1]/float(image_gray.shape[0])
image = cv2.resize(image_gray, (int(scale*resize_h), resize_h))
image_color_cropped = image[padding:resize_h-padding,0:image_gray.shape[1]]
image_gray = cv2.cvtColor(image_color_cropped,cv2.COLOR_RGB2GRAY)
watches = watch_cascade.detectMultiScale(image_gray, en_scale, 2, minSize=(36, 9),maxSize=(36*40, 9*40))
cropped_images = []
for (x, y, w, h) in watches:
#cv2.rectangle(image_color_cropped, (x, y), (x + w, y + h), (0, 0, 255), 1)
x -= w * 0.14
w += w * 0.28
y -= h * 0.15
h += h * 0.3
#cv2.rectangle(image_color_cropped, (int(x), int(y)), (int(x + w), int(y + h)), (0, 0, 255), 1)
cropped = cropImage(image_color_cropped, (int(x), int(y), int(w), int(h)))
cropped_images.append([cropped,[x, y+padding, w, h]])
#cv2.imshow("imageShow", cropped)
#cv2.waitKey(0)
return cropped_images
def cropImage(image,rect):
cv2.imshow("imageShow", image)
cv2.waitKey(0)
x, y, w, h = computeSafeRegion(image.shape,rect)
cv2.imshow("imageShow", image[y:y+h,x:x+w])
cv2.waitKey(0)
return image[y:y+h,x:x+w]
def computeSafeRegion(shape,bounding_rect):
top = bounding_rect[1] # y
bottom = bounding_rect[1] + bounding_rect[3] # y + h
left = bounding_rect[0] # x
right = bounding_rect[0] + bounding_rect[2] # x + w
min_top = 0
max_bottom = shape[0]
min_left = 0
max_right = shape[1]
#print(left,top,right,bottom)
#print(max_bottom,max_right)
if top < min_top:
top = min_top
if left < min_left:
left = min_left
if bottom > max_bottom:
bottom = max_bottom
if right > max_right:
right = max_right
return [left,top,right-left,bottom-top]
images = detectPlateRough(image,image.shape[0],top_bottom_padding_rate=0.1)
Related links:
Top comments (1)
Hey How Can i use this for any other image . This is working well with the specifies image but i wanna use it for any other image .Help me to do so.
Some comments may only be visible to logged-in visitors. Sign in to view all comments.