DEV Community

Cover image for Car number plate detection with Python

Posted on

Car number plate detection with Python

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


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)
        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)
        return cropped_images

def cropImage(image,rect):
        cv2.imshow("imageShow", image)
        x, y, w, h = computeSafeRegion(image.shape,rect)
        cv2.imshow("imageShow", image[y:y+h,x:x+w])
        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]


        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:

Discussion (2)

tanay200 profile image

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.