Commit 57cdc26e authored by Taddeus Kroes's avatar Taddeus Kroes

Merge branch 'master' of github.com:taddeus/licenseplates

parents d3bc209a 2f5359ff
from LocalBinaryPatternizer import LocalBinaryPatternizer from LocalBinaryPatternizer import LocalBinaryPatternizer
class Character: class Character:
def __init__(self, value, corners, image): def __init__(self, value, corners, image, filename=None):
self.value = value self.value = value
self.corners = corners self.corners = corners
self.image = image self.image = image
self.filename = filename
def get_feature_vector(self): def get_feature_vector(self):
pattern = LocalBinaryPatternizer(self.image) pattern = LocalBinaryPatternizer(self.image)
......
...@@ -10,77 +10,8 @@ class LicensePlate: ...@@ -10,77 +10,8 @@ class LicensePlate:
def __init__(self, folder_nr, file_nr): def __init__(self, folder_nr, file_nr):
filename = '%04d/00991_%04d%02d' % (folder_nr, folder_nr, file_nr) filename = '%04d/00991_%04d%02d' % (folder_nr, folder_nr, file_nr)
self.dom = parse('../images/Infos/%s.info' % filename)
properties = self.get_properties()
self.image = GrayscaleImage('../images/Images/%s.jpg' % filename) self.image = GrayscaleImage('../images/Images/%s.jpg' % filename)
self.width = int(properties['width']) self.read_xml(filename)
self.height = int(properties['height'])
self.read_xml()
def are_corners_sorted(corners):
'''Check if points are sorted clockwise, starting in the left-top
corner.'''
x0, y0 = corners[0].to_tuple()
x1, y1 = corners[1].to_tuple()
x2, y2 = corners[2].to_tuple()
x3, y3 = corners[3].to_tuple()
return x0 < x1 and y1 <= y2 and x2 >= x3 and y3 > y0
def sort_corners(corners):
'''Sort the corners clockwise, starting in the left-top corner.'''
tuples = []
output = []
for point in corners:
tuples.append(point.to_tuple())
bot1 = (0, 0)
bot2 = (0, 0)
top1 = None
top2 = None
# Get bottom points (where the y value is the largest). The top points
# are the points that are not a bottom point.
for tup in tuples:
if tup[1] > bot1[1] or tup[1] > bot2[1]:
if top1 == None:
top1 = bot2
else:
top2 = bot2
if tup[1] > bot1[1]:
bot2 = bot1
bot1 = tup
else:
bot2 = tup
else:
if top1 == None:
top1 = tup
else:
top2 = tup
# First point is the smallest x-value top point, second is the other
# top point
if top1[0] < top2[0]:
output.append(Point(top1[0], top1[1]))
output.append(Point(top2[0], top2[1]))
else:
output.append(Point(top2[0], top2[1]))
output.append(Point(top1[0], top1[1]))
# Third point is the bottom point with the largest x-value, fourth is
# the other bottom point
if bot1[0] > bot2[0]:
output.append(Point(bot1[0], bot1[1]))
output.append(Point(bot2[0], bot2[1]))
else:
output.append(Point(bot2[0], bot2[1]))
output.append(Point(bot1[0], bot1[1]))
return output
# sets the entire license plate of an image # sets the entire license plate of an image
def retrieve_data(self, corners): def retrieve_data(self, corners):
...@@ -153,68 +84,48 @@ class LicensePlate: ...@@ -153,68 +84,48 @@ class LicensePlate:
return 0 return 0
# Testing purposes def read_xml(self, filename):
def show(self): dom = parse('../images/Infos/%s.info' % filename)
from pylab import imshow, show self.characters = []
imshow(self.data, cmap="gray")
show() version = dom.getElementsByTagName("current-version")[0].firstChild.data
info = dom.getElementsByTagName("info")
def get_properties(self):
children = self.get_children("properties") for i in info:
if version == i.getElementsByTagName("version")[0].firstChild.data:
properties = {}
self.country = i.getElementsByTagName("identification-letters")[0].firstChild.data
for child in children:
if child.nodeType == child.TEXT_NODE:
properties[child.nodeName] = child.data temp = i.getElementsByTagName("characters")
elif child.nodeType == child.ELEMENT_NODE:
properties[child.nodeName] = child.firstChild.data if len(temp):
characters = temp[0].childNodes
return properties else:
self.characters = []
# TODO : create function for location / characters as they do the same break
def read_xml(self):
children = self.get_children("plate") # most recent version for character in characters:
if character.nodeName == "character":
for child in children: value = character.getElementsByTagName("char")[0].firstChild.data
if child.nodeName == "regnum": corners = self.get_corners(character)
self.license_full = child.firstChild.data
elif child.nodeName == "identification-letters": if not len(corners) == 4:
self.country = child.firstChild.data break
elif child.nodeName == "location":
self.corners = self.get_corners(child) data = self.retrieve_data(corners)
elif child.nodeName == "characters": image = NormalizedCharacterImage(data=data)
nodes = child.childNodes
self.characters.append(Character(value, corners, image))
self.characters = []
break
for character in nodes:
if character.nodeName == "character": def get_corners(self, dom):
value = self.get_node("char", character).firstChild.data nodes = dom.getElementsByTagName("point")
corners = self.get_corners(character)
data = self.retrieve_data(corners)
image = NormalizedCharacterImage(data=data)
self.characters.append(Character(value, corners, image))
else:
pass
def get_node(self, node, dom=None):
if not dom:
dom = self.dom
return dom.getElementsByTagName(node)[0]
def get_children(self, node, dom=None):
return self.get_node(node, dom).childNodes
def get_corners(self, child):
nodes = self.get_children("quadrangle", child)
corners = [] corners = []
for corner in nodes: for node in nodes:
if corner.nodeName == "point": corners.append(Point(node))
corners.append(Point(corner))
return corners return corners
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment