|
- #coding=utf-8
- from . import detect
- from . import finemapping as fm
-
- from . 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
- from . import typeDistinguish as td
- import imp
-
-
- imp.reload(sys)
- fontC = ImageFont.truetype("./Font/platech.ttf", 14, 0);
-
- from . import e2e
- #寻找车牌左右边界
-
- 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] + 115), 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)
- draw.text((int(rect[0]+1), int(rect[1]-16)), addText, (255, 255, 255), font=fontC)
- imagex = np.array(img)
-
- return imagex
-
-
- from . import cache
- from . 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
- res, confidence = e2e.recognizeOne(origin_plate)
- print("res",res)
-
- 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<4:
- 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,"校正"
- print("e2e:",e2e.recognizeOne(image_rgb)[0])
- image_gray = cv2.cvtColor(image_rgb,cv2.COLOR_BGR2GRAY)
-
- cv2.imwrite("./"+str(j)+".jpg",image_gray)
- # image_gray = horizontalSegmentation(image_gray)
-
- t2 = time.time()
- res, confidence = e2e.recognizeOne(image_rgb)
- res_json = {}
- if confidence > 0.6:
- res_json["Name"] = res
- res_json["Type"] = td.plateType[ptype]
- res_json["Confidence"] = confidence;
- res_json["x"] = int(rect[0])
- res_json["y"] = int(rect[1])
- res_json["w"] = int(rect[2])
- res_json["h"] = int(rect[3])
- jsons.append(res_json)
- print(json.dumps(jsons,ensure_ascii=False))
-
- return json.dumps(jsons,ensure_ascii=False)
-
-
-
-
- def SimpleRecognizePlateByE2E(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))
- res,confidence = e2e.recognizeOne(origin_plate)
- print("res",res)
-
- t1 = time.time()
- ptype = td.SimplePredict(plate)
- if ptype>0 and ptype<5:
- # pass
- plate = cv2.bitwise_not(plate)
- image_rgb = fm.findContoursAndDrawBoundingBox(plate)
- image_rgb = fv.finemappingVertical(image_rgb)
- image_rgb = fv.finemappingVertical(image_rgb)
- cache.verticalMappingToFolder(image_rgb)
- cv2.imwrite("./"+str(j)+".jpg",image_rgb)
- res,confidence = e2e.recognizeOne(image_rgb)
- print(res,confidence)
- res_set.append([[],res,confidence])
-
- if confidence>0.7:
- image = drawRectBox(image, rect, res+" "+str(round(confidence,3)))
- return image,res_set
-
-
- 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)
- print("e2e:", e2e.recognizeOne(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
-
-
-
|