Car number plate detection with Python
Tags: python
Published: 2019-07-10 13:10:29

---
title: Car number plate detection with Python
published: true
description: python
tags: python
cover_image: https://thepracticaldev.s3.amazonaws.com/i/7aspr5uucso3m43epj8m.png
---
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:

![](https://thepracticaldev.s3.amazonaws.com/i/s0cyjx6pkx7c43atcj2e.jpg)

Copy the cascade file from here: <a href="https://raw.githubusercontent.com/zeusees/HyperLPR/master/model/cascade.xml">Download cascade file</a>

Then apply the cascade file to the image and find the plates. Run the program to find the number plate

![](https://thepracticaldev.s3.amazonaws.com/i/7aspr5uucso3m43epj8m.png)

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:
* <a href="https://opencv.org/">OpenCv module</a>
* <a href="https://gumroad.com/l/GQWGG">Computer vision course</a>
* <a href="https://pythonbasics.org/">Learn Python, tutorial</a>