Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to recognize vehicle license / number plate (ANPR) from an image? [closed]

I have a web site that allows users to upload images of cars and I would like to put a privacy filter in place to detect registration plates on the vehicle and blur them.

The blurring is not a problem but is there a library or component (open source preferred) that will help with finding a licence within a photo?

Caveats;

  1. I know nothing is perfect and image recognition of this type will provide false positive and negatives.
  2. I appreciate that we could ask the user to select the area to blur and we will do this as well, but the question is specifically about finding that data programmatically; so answers such as 'get a person to check every image' is not helpful.
  3. This software method is called 'Automatic Number Plate Recognition' in the UK but I cannot see any implementations of it as libraries.
  4. Any language is great although .Net is preferred.
like image 857
Ryan O'Neill Avatar asked Jun 11 '09 14:06

Ryan O'Neill


People also ask

Can OCR read number plates?

If the car exceeds the speed limit, you can analyze the license plate, apply OCR to it, and log the license plate number to a database. Such a system could help reduce speeding violations and create better neighborhood safety.

Is there an app that can read license plates?

The prototype app, called DiDi Plate, uses an Android phone's camera to scan the plate and send it to a cloud ID service. The driver who scanned the plate can then start texting the other driver. "Even if the other driver didn't register this app, you can still give them greetings and comments," Du said.

Which algorithm is used for number plate detection?

LPR algorithm consists of the following three processing steps: 1) Number plate detection, 2) Character segmentation, and 3) Character recognition. The accuracy of plate extraction relies on the character segmentation and character recognition.


2 Answers

EDIT: I wrote a Python script for this.

As your objective is blurring (for privacy protection), you basically need a high recall detector as a first step. Here's how to go about doing this. The included code hints use OpenCV with Python.

  1. Convert to Grayscale.
  2. Apply Gaussian Blur.

    img = cv2.imread('input.jpg',1) img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) img_gray = cv2.GaussianBlur(img_gray, (5,5), 0)   

Let the input image be the following.

enter image description here

  1. Apply Sobel Filter to detect vertical edges.
  2. Threshold the resultant image using strict threshold or OTSU's binarization.

    cv2.Sobel(image, -1, 1, 0) cv2.threshold()  
  3. Apply a Morphological Closing operation using suitable structuring element. (I used 16x4 as structuring element)

    se = cv2.getStructuringElement(cv2.MORPH_RECT,(16,4)) cv2.morphologyEx(image, cv2.MORPH_CLOSE, se)   

Resultant Image after Step 5.

enter image description here

  1. Find external contours of this image.

    cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)  
  2. For each contour, find the minAreaRect() bounding it.

  3. Select rectangles based on aspect ratio, minimum and maximum area, and angle with the horizontal. (I used 2.2 <= Aspect Ratio <= 8, 500 <= Area <=15000, and angle <= 45 degrees)

All minAreaRect()s are shown in orange and the one which satisfies our criteria is in green.

enter image description here

  1. There may be false positives after this step, to filter it, use edge density. Edge Density is defined as the number of white pixels/total number of pixels in a rectangle. Set a threshold for edge density. (I used 0.5)

enter image description here

  1. Blur the detected regions.

enter image description here

You can apply other filters you deem suitable to increase recall and precision. The detection can also be trained using HOG+SVM to increase precision.

like image 112
Abdul Fatir Avatar answered Sep 21 '22 01:09

Abdul Fatir


I coded a C# version based on JAVA ANPR, but I changed the awt library functions with OpenCV. You can check it at http://anprmx.codeplex.com

like image 40
Jivan Miranda Avatar answered Sep 20 '22 01:09

Jivan Miranda