CLWONG - 3 months ago 52
Python Question

# License plate Detection from car camera

I am using Python and Opencv. I am doing a project to recognize the license plate from a car camera.

I have tried to use

`Canny()`
, but I still cant recognize the plate.

Here is the frame I captured.

1)

First, I convert the image into gray-scale, increase the contract of color and finally convert it into "edged image"

``````img = cv2.imread("plate.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.equalizeHist(gray)
edged = cv2.Canny(gray, 200, 255)
``````

Here is the result that what I get:

2)

Afterwards, I try to find a rectangle contour as following, I tried to filter out the irrelevant rectangle by area and length and irregular polygon by
`convexHull()`
:

``````(cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts=sorted(cnts, key = cv2.contourArea, reverse = True)[:10]

# loop over our contours
plate_candidates = []
for c in cnts:
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.02 * peri, True)
area = cv2.contourArea(approx)
if len(approx) == 4 and area <=1000 and area >=500 and self._length_checking(approx):
hull = cv2.convexHull(approx,returnPoints = True)
if len(hull) ==4:
plate_candidates.append(approx)
cv2.drawContours(show, [approx], -1, (0,255,0), 3)
``````

But still, I cannot recognize the plate. I am looking for help how can I detect the license plate. Thank you.

You could use minimal bounding rectangle of the convex hull to calculate the "rectangleness" of your candidate contours (in the latest version of openCV you can use `cv2.boxPoints` to calculate `rectPoints`):

``````def rectangleness(hull):
rect = cv2.boundingRect(hull)
rectPoints = np.array([[rect[0], rect[1]],
[rect[0] + rect[2], rect[1]],
[rect[0] + rect[2], rect[1] + rect[3]],
[rect[0], rect[1] + rect[3]]])
intersection_area = cv2.intersectConvexConvex(np.array(rectPoints), hull)[0]
rect_area = cv2.contourArea(rectPoints)
rectangleness = intersection_area/rect_area
return rectangleness
``````

However in your case this is actually overkill, it's enough to use the area of the polygon — either of the polygons within your area cutoff (the first two contours in `cnts`) could be used to obtain the bounding rectangle surrounding the licence plate.

Source (Stackoverflow)