You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
248 lines
6.8 KiB
Python
248 lines
6.8 KiB
Python
#coding=utf-8
|
|
import detect
|
|
import finemapping as fm
|
|
|
|
import segmentation
|
|
import cv2
|
|
|
|
import time
|
|
import numpy as np
|
|
|
|
from PIL import ImageFont
|
|
from PIL import Image
|
|
from PIL import ImageDraw
|
|
import json
|
|
|
|
import sys
|
|
import typeDistinguish as td
|
|
|
|
|
|
reload(sys)
|
|
sys.setdefaultencoding("utf-8")
|
|
|
|
fontC = ImageFont.truetype("./Font/platech.ttf", 14, 0);
|
|
|
|
|
|
#寻找车牌左右边界
|
|
|
|
def find_edge(image):
|
|
sum_i = image.sum(axis=0)
|
|
sum_i = sum_i.astype(np.float)
|
|
sum_i/=image.shape[0]*255
|
|
# print sum_i
|
|
|
|
start= 0 ;
|
|
end = image.shape[1]-1
|
|
|
|
for i,one in enumerate(sum_i):
|
|
if one>0.4:
|
|
start = i;
|
|
if start-3<0:
|
|
start = 0
|
|
else:
|
|
start -=3
|
|
|
|
break;
|
|
for i,one in enumerate(sum_i[::-1]):
|
|
|
|
if one>0.4:
|
|
end = end - i;
|
|
if end+4>image.shape[1]-1:
|
|
end = image.shape[1]-1
|
|
else:
|
|
end+=4
|
|
break
|
|
return start,end
|
|
|
|
|
|
#垂直边缘检测
|
|
|
|
def verticalEdgeDetection(image):
|
|
image_sobel = cv2.Sobel(image.copy(),cv2.CV_8U,1,0)
|
|
# image = auto_canny(image_sobel)
|
|
|
|
# img_sobel, CV_8U, 1, 0, 3, 1, 0, BORDER_DEFAULT
|
|
# canny_image = auto_canny(image)
|
|
flag,thres = cv2.threshold(image_sobel,0,255,cv2.THRESH_OTSU|cv2.THRESH_BINARY)
|
|
print flag
|
|
flag,thres = cv2.threshold(image_sobel,int(flag*0.7),255,cv2.THRESH_BINARY)
|
|
# thres = simpleThres(image_sobel)
|
|
kernal = np.ones(shape=(3,15))
|
|
thres = cv2.morphologyEx(thres,cv2.MORPH_CLOSE,kernal)
|
|
return thres
|
|
|
|
#确定粗略的左右边界
|
|
def horizontalSegmentation(image):
|
|
|
|
thres = verticalEdgeDetection(image)
|
|
# thres = thres*image
|
|
head,tail = find_edge(thres)
|
|
# print head,tail
|
|
# cv2.imshow("edge",thres)
|
|
tail = tail+5
|
|
if tail>135:
|
|
tail = 135
|
|
image = image[0:35,head:tail]
|
|
image = cv2.resize(image, (int(136), int(36)))
|
|
return image
|
|
|
|
|
|
|
|
#打上boundingbox和标签
|
|
def drawRectBox(image,rect,addText):
|
|
cv2.rectangle(image, (int(rect[0]), int(rect[1])), (int(rect[0] + rect[2]), int(rect[1] + rect[3])), (0,0, 255), 2,cv2.LINE_AA)
|
|
cv2.rectangle(image, (int(rect[0]-1), int(rect[1])-16), (int(rect[0] + 80), int(rect[1])), (0, 0, 255), -1,
|
|
cv2.LINE_AA)
|
|
|
|
img = Image.fromarray(image)
|
|
draw = ImageDraw.Draw(img)
|
|
draw.text((int(rect[0]+1), int(rect[1]-16)), addText.decode("utf-8"), (255, 255, 255), font=fontC)
|
|
imagex = np.array(img)
|
|
|
|
return imagex
|
|
|
|
|
|
|
|
|
|
import cache
|
|
import finemapping_vertical as fv
|
|
|
|
|
|
def RecognizePlateJson(image):
|
|
|
|
images = detect.detectPlateRough(image,image.shape[0],top_bottom_padding_rate=0.1)
|
|
|
|
jsons = []
|
|
|
|
for j,plate in enumerate(images):
|
|
|
|
|
|
plate,rect,origin_plate =plate
|
|
|
|
|
|
cv2.imwrite("./"+str(j)+"_rough.jpg",plate)
|
|
|
|
# print "车牌类型:",ptype
|
|
# plate = cv2.cvtColor(plate, cv2.COLOR_RGB2GRAY)
|
|
plate =cv2.resize(plate,(136,int(36*2.5)))
|
|
t1 = time.time()
|
|
|
|
|
|
ptype = td.SimplePredict(plate)
|
|
if ptype>0 and ptype<5:
|
|
plate = cv2.bitwise_not(plate)
|
|
# demo = verticalEdgeDetection(plate)
|
|
|
|
image_rgb = fm.findContoursAndDrawBoundingBox(plate)
|
|
image_rgb = fv.finemappingVertical(image_rgb)
|
|
cache.verticalMappingToFolder(image_rgb)
|
|
# print time.time() - t1,"校正"
|
|
|
|
image_gray = cv2.cvtColor(image_rgb,cv2.COLOR_BGR2GRAY)
|
|
|
|
|
|
cv2.imwrite("./"+str(j)+".jpg",image_gray)
|
|
# image_gray = horizontalSegmentation(image_gray)
|
|
|
|
|
|
t2 = time.time()
|
|
val = segmentation.slidingWindowsEval(image_gray)
|
|
if len(val)==3:
|
|
blocks, res, confidence = val
|
|
if confidence/7>0.0:
|
|
image = drawRectBox(image,rect,res)
|
|
for i,block in enumerate(blocks):
|
|
|
|
block_ = cv2.resize(block,(25,25))
|
|
block_ = cv2.cvtColor(block_,cv2.COLOR_GRAY2BGR)
|
|
image[j * 25:(j * 25) + 25, i * 25:(i * 25) + 25] = block_
|
|
if image[j*25:(j*25)+25,i*25:(i*25)+25].shape == block_.shape:
|
|
pass
|
|
|
|
plate_name = res
|
|
res_json = {}
|
|
if confidence/7>0.0:
|
|
res_json["Name"] = plate_name.decode()
|
|
res_json["Type"] = td.plateType[ptype]
|
|
res_json["Confidence"] = confidence/7;
|
|
res_json["x"] = int(rect[0])
|
|
res_json["y"] = int(rect[1])
|
|
res_json["w"] = int(rect[2])
|
|
res_json["h"] = int(rect[3])
|
|
# print "车牌:",res,"置信度:",confidence/7
|
|
jsons.append(res_json)
|
|
|
|
|
|
else:
|
|
pass
|
|
# print "不确定的车牌:", res, "置信度:", confidence
|
|
print jsons
|
|
print json.dumps(jsons,ensure_ascii=False,encoding="gb2312")
|
|
|
|
return json.dumps(jsons,ensure_ascii=False,encoding="gb2312")
|
|
|
|
|
|
|
|
|
|
|
|
def SimpleRecognizePlate(image):
|
|
t0 = time.time()
|
|
images = detect.detectPlateRough(image,image.shape[0],top_bottom_padding_rate=0.1)
|
|
res_set = []
|
|
for j,plate in enumerate(images):
|
|
plate, rect, origin_plate =plate
|
|
# plate = cv2.cvtColor(plate, cv2.COLOR_RGB2GRAY)
|
|
plate =cv2.resize(plate,(136,36*2))
|
|
t1 = time.time()
|
|
|
|
ptype = td.SimplePredict(plate)
|
|
if ptype>0 and ptype<5:
|
|
plate = cv2.bitwise_not(plate)
|
|
|
|
image_rgb = fm.findContoursAndDrawBoundingBox(plate)
|
|
image_rgb = fv.finemappingVertical(image_rgb)
|
|
cache.verticalMappingToFolder(image_rgb)
|
|
image_gray = cv2.cvtColor(image_rgb,cv2.COLOR_RGB2GRAY)
|
|
|
|
# image_gray = horizontalSegmentation(image_gray)
|
|
cv2.imshow("image_gray",image_gray)
|
|
# cv2.waitKey()
|
|
|
|
cv2.imwrite("./"+str(j)+".jpg",image_gray)
|
|
# cv2.imshow("image",image_gray)
|
|
# cv2.waitKey(0)
|
|
print "校正",time.time() - t1,"s"
|
|
# cv2.imshow("image,",image_gray)
|
|
# cv2.waitKey(0)
|
|
t2 = time.time()
|
|
val = segmentation.slidingWindowsEval(image_gray)
|
|
# print val
|
|
print "分割和识别",time.time() - t2,"s"
|
|
if len(val)==3:
|
|
blocks, res, confidence = val
|
|
if confidence/7>0.7:
|
|
image = drawRectBox(image,rect,res)
|
|
res_set.append(res)
|
|
for i,block in enumerate(blocks):
|
|
|
|
block_ = cv2.resize(block,(25,25))
|
|
block_ = cv2.cvtColor(block_,cv2.COLOR_GRAY2BGR)
|
|
image[j * 25:(j * 25) + 25, i * 25:(i * 25) + 25] = block_
|
|
if image[j*25:(j*25)+25,i*25:(i*25)+25].shape == block_.shape:
|
|
pass
|
|
|
|
|
|
if confidence>0:
|
|
print "车牌:",res,"置信度:",confidence/7
|
|
else:
|
|
pass
|
|
|
|
# print "不确定的车牌:", res, "置信度:", confidence
|
|
|
|
print time.time() - t0,"s"
|
|
return image,res_set
|
|
|
|
|
|
|
|
|