lucians home

License plate detection with OpenCV and Python

Next you will find some code which will let you to detect license plate. This project is divided mainly in two parts: plate detection and character recognition.

The code you will find next is an adaptation of Chris Dahms original License Plate Recognition. A video of his work can be found here as longs as his original source code.

I made this work (pretty much some refactoring) mainly because I was in need of a simple system to detect the license plate area in images. His aproach is good but his code contained also a character recognition system which I don’t need actually. I plan to use my own in the second part of this project.

For someone this code will be easier to understand due to it’s “straight to the point” way, for someone else will be like I did an awful job. The goal was for me to understand what I was doing and to create a ready-to-go system. This was achieved and it’s enough.

Code has been tested only with european license plates, especially with italian ones. I don’t know if it’s gonna work with other country plates. To do that you will have to adapt the code to your situation and, eventually, stick with a totally different approach.

Code is in Python 3.6 and OpenCV 3.4. You will find the whole source at the end of this article. Any suggestion is widely accepted.

This is the image we are working on. Later I’ll show you the result with other images.


Then some basic preprocessing is applied.


After that morphological operations called Top Hat and Black Hat are applied.

Morphological transformations are some simple operations based on the image shape.

It is normally performed on binary images. It needs two inputs, one is our original image, second one is called structuring element or kernel which decides the nature of operation.

We built the kernel before Top and Black hat processing. More about these operations are available here.



We are going to subtract values between add value (in the code we are adding gray and TopHat) and BlackHat.


Next Gaussian blur is added with a kernel of 5.


Threshold operations is applied on gaussian blur.


Contours are checked. From here we are starting to look for characters. Indeed this method is based in searching for contours that might look like alphanumeric chars. This is the process from now:

– check each contour
– if it look like a char then save it in a list
– don’t consider any contour which don’t respect this condition
– detect the group of characters with a ROI and save it

Further on, in a coming article, I’ll show you how to process this image and do OCR on it.


After the first wave of cleaning operations (aka mathematical operations on each contour ) this is the result.


A second filter is applied and our plate seems to be detected, somehow.


Finally, we construct a ROI around these contours. This will be cropped and used next for OCR.


Here the ROI was applied on the original image for a more scenic result


Final cropped image, our plate.


Source code is available on GitHub.

To run it, extract the files in a folder and, using a CMD/Powershell, execute the file passing as argument the image you want to process.

python --image car.png

These are other results I achieved.

Some good results...


...and some fails.


As you can see, for some images (even some “easy” and “obviously”) the recognition fails miserably. This because the system is a general one and, to work on more plates it have to be tweaked more. Also plates with different backgrounds, fonts and dimensions create confusion because of many variables.

Now you can understand why this isn’t an easy task by using traditional methods. Applying machine learning technics would highly improve the result.

UPDATE: now that you have some plates, try to OCR-em by reading the new blog post here.