"In the world ye shall have tribulation: but be of good cheer; I have overcome the world." –John 16:33

San Pedro Garza Garcia

Tag: license plate reading

License plate reading: The template to find the plate works great, but needs some refinement

Well, I got the template matching going this evening.  It works great.  It is very forgiving for size and angle as can be seen by the images below.  The thing I really need to do next is get a somewhat bigger sample taken of cars pulling up to a fixed location so I can better characterize the size of the plate in the image over a fairly large range of cars.  The image of the pickup plates were taken further away than for the car.  There was variability in both angle and size for all the plates, but the same template set was able to find them all very well.  I have a few cleanup things I need to do before I move on which include some speedup work and some precsion improvements.  I am searching in rotation right now, but not in scale.  After I see the more controlled sample set, I will know whether I need to add scale.  After that, I will move on to segmenting the individual characters.

Found plate - car image 001

Found plate - car image 002

Found plate - pickup image 001

Found plate - pickup image 002

License plate reading: Handling plate rotation

Day 335 of 1000

Today, I was able to build an “on-the-fly” template that handles ±5º of rotation.  I just have the template search complete, too, but I do not think I will get it completed before the end of the evening.  Here is a GIF animation of all the patterns for the template search described yesterday.

Rotated license plate template gif

License plate reading: Using a template to find the lettering

Now were getting to the fun part.  I am going to start trying things, one by one, to try to find the lettering on the license plate.  The first thing I want to try is template matching.  From the very limited sample set, I can see that the license plate letters can be turned into a block of white (uising previous preprocessing combined with some morphology) like this:

and like this:

My thinking is that to start with a template that looks like the white rectangle in the image below.  I generated it automatically based on the relative size of a license plate (12″x6″) and the width of a typical car (6′) and the distance I measured between the outsides of the brakelights.

I will have to rotate the template +/- five degrees and apply it multiple times to find the best match, but that will go pretty fast.  My hope is that it will give me a repeatable, robust position of the center of the license plate.  If it does, I will try to start separating the characters.  If it does not, I will try a few more tricks.

License plate reading: Narrowing the license plate search area

Day 329 of 1000

I had a little time this afternoon to play with the images I generated yesterday.  You can see the previous steps I took to get to this point here.  The first step I took was to find the brakelights based on yesterdays images.  That was not too hard, but I am going to have to spend some time to handle the variability in brakelight sizes, intensity, and shade.  Nevertheless, it is definitely something with which I can work.  Here are the brakelight finds for a couple of the sample images:

Back of car - brake light find Back of pickup - brakelight find

From there, I established a search window within which to look for the plate.  I put the search region at the bottom of the image which is something I will have to adjust, but I should be able to narrow the window down both horizontally and vertically without too much trouble.

Back of car - plate search ROI Back of pickup - plate search ROI

The next step will be to “robustify” the brakelight finder and narrow down the search region for the plate.  It might take me a week or so to get back to this as I have lots of stuff on my day job right now.

License plate reading: Great progress in finding the plate

I spent several hours today working on some of the preprocessing I think might help me find the license plate on the back of a car.  As always with this type of problem it is good to start with a few easy cases to help lay some of the groundwork.  That is exactly what I did.  I got a few of images each of the back of a pickup and the back of a car to use as my sample development images.  Here are a couple of sample images so you can see what I am talking about:

Back of car - original Back of pickup - original

My first thought in looking at the images is that there are a lot more edges in the area of the license plate than in other areas of the image so I ran a Sobel magnitude on the entire scene to see if that idea held water.  The following are the Sobel magnitude images:

Back of car - sobel magnitude Back of pickup - sobel magnitude

I was right about the license plate lettering, the sobel magnitude image shows a high density of edges, but the proble with this is that there are other high edge density areas of the image.  What I needed was a way to narrow down the number of edges so I decided to separate the veritcal edges from the horizontal edges.  The horizontal edge image was pretty worthless, but the vertical edge image diminshed many of the extraneous, non-licencse plate edges while still maintaining high density in the are of license plate.  The following are the vertical and horizontal edge magnitude images for the car:

Back of car - horizontal edge images Back of car - vertical edge images

So we are a lot closer than when we stared.  We could probably do some morphology coupled with connectivity analysis (blobs) and have a pretty good probability of knowing the position of the license plate for these particular cars.  After thinking about it for awhile, I thought I would try one more thing to narrow down the search area for the license plates.  One thing we have going for us is that the license plate for legal cars should always be somewhere between two red tail lights.  So the next step I thought it would be good for us to take is to create an image that maximizes the red channel and suppresses the non-red area of the image.  On these two cars, I got some pretty amazing results:

Back of car - red maximization/non-red damping Back of pickup - red maximization/non-red damping

We got very good results.  Almost everything in the image is dark with the exception of the red tail lights of the vehicles.  The letters on these license plates just happen to be red, so they showed up quite well, too, but not all plates have red lettering.  We will have to see what happens on red cars, too.  Still, license plate lettering has a finite number of colors, so we will be able to use that to our advantage in the future.  I think we are at a point now where I will be able to combine the information from the vertical edge image and the red channel maximized image to start looking for the plate.  I will do some image cleanup (morphology and other filters) along with connectivity analysis or area image statistics to isolate the plate.  I will probably do that next week or whenever I get a chance to get back to this.

License plate reading progress

I thought I would put up a brief update on the license plate reading project.  The first thing we have to do is gather a bunch of images of the backs of cars in the right setting.  I have made further progress on the application to do that.  Our plan is to send out a camera and a netbook computer with some mounting hardware to my cousin in Oregon how is starting a new drive-through business.  We will set up an ftp site in our office to gather images for a development and test data set.  The business in Oregon is not yet open and we will probably not be ready to send anything out there for a couple of months anyway.  Still, we have a good start and I am capturing images from a webcam.  The next step will be to use an industrial machine vision camera rather than a webcam so it can handle life in the wild.

I am doing most of my programming on a Windows laptop, but also have my Xubuntu netbook which will be the delivery platform.  I have a microcontroller for digital I/O hooked up and talking to the windows laptop.  Tomorrow, I am going to get that going on the Xubuntu netbook if I have enough time.

New license plate reading project

Day 294 of 1000

I talked about a new project on which I am about to embark.  There will be a part of this project that is not so technical, but more business/touchy-feely/people oriented, but we have to start with this.  The touch-feely part will not start for several to many months.  Still, we have to do the technical part before we can get to the people oriented part.

The first part of the project that belongs to me is the reading of license plates with an embedded Linux computer.  I have a BeagleBoard XM that will work just fine.  It has four USB ports to hook up cameras and works great with eLinux.

BeagleBoard XM for license plate reading project

BeagleBoard XM

 

I have hooked up a keyboard, mouse, and monitor to the BeagleBoard for development.

BeagleBoard with keyboard, mouse, and monitor

BeagleBoard XM development setup

After everything is developed, none of that stuff will be attached.  The only things that will be attached are two cameras, one for license plate images and one for snapshots.  More about those snapshots in post that will not appear for several months.  Right now we are concentrating on getting the system to read license plates.  Here are the cameras we will use to do the development.  I am not sure we will use them for the final product, but this is how we are going to start.

Cameras for the coffee development project

Imaging Souce cameras to hook to the BeagleBoard XM

The system I develop will report the license plates numbers to a second computer.  I will use a EeePC netbook as the computer server that receives the license plate numbers and images from a snapshot after they are read.  Both of these computers will run the Xubuntu operating system.  In real life, the EeePC will not be the server with whom the BeagleBoard normally talks, but I need something to emulate the process while I develop the license plate reading capabilities.  I am going to try to use Xubuntu on the BeagleBoard for this project.  I will have more to say about that later.

EeePC netbook to act as a development server for coffee project

EeePC to recieve license plate numbers and images

Powered by WordPress & Theme by Anders Norén