import cv2
import numpy as np
import math
import sys
import os
from pyocr import pyocr
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib
STEP = int(0)
def showWindow(img):
pass
# global STEP
# STEP = STEP + 1
# title = "step" + str(STEP)
# cv2.namedWindow(title)
# cv2.imshow(title, img)
# cv2.waitKey(0)
# cv2.destroyWindow(title)
def image_rotate_newsize(src, center , angle , scale) :
angle2 = angle * math.acos(-1.0) / 180
height , width = src.shape[:2]
alpha = math.cos(angle2) * scale
beta = math.sin(angle2) * scale
new_width = int(width * math.fabs(alpha) + height * math.fabs(beta))
new_height = int(width * math.fabs(beta) + height * math.fabs(alpha))
center = (float(width / 2), float(height / 2))
M = cv2.getRotationMatrix2D(center, angle, scale)
M[0][2] += int((new_width - width) / 2)
M[1][2] += int((new_height - height) / 2)
dst = cv2.warpAffine(src , M, (new_width, new_height) , borderValue = 255)
return dst
def chi_sim(src):
tools = pyocr.get_available_tools()[:]
if len(tools) == 0:
return "failed"
src = cv2.cvtColor(src , cv2.COLOR_RGB2GRAY)
img = Image.fromarray(src)
str = tools[0].image_to_string(img, lang='chi_sim')
if str == None :
return "failed"
str = str.replace(" " , "")
if str == None:
return "failed"
if (str.count("mu") > 0 ) or (str.count("MU") > 0) or (str.count("E") > 0):
str = str.replace("O" , "0").replace("o" , "0")
ok = True
for d in str[2:]:
if not ('0' <= d and d <= '9'):
ok = False
if ok:
return str
return tools[0].image_to_string(img, lang='eng')
return str
def recog(img_path):
img = cv2.imread(img_path)
split_y = 10000
split_y1 = None
split_y2 = None
split_x1 = None
split_x2 = None
split_theta = None
img = cv2.resize(img, (210 * 4, 297 * 4), interpolation=cv2.INTER_CUBIC)
src = img.copy()
showWindow(img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 180)
lines = cv2.HoughLines(edges, 1, np.pi / 180, 350)
lines1 = lines[:, 0, :]
for rho, theta in lines1[:]:
if (theta < (np.pi / 4.)) or (theta > (3. * np.pi / 4.0)):
continue
a = np.cos(theta)
b = np.sin(theta)
x0 = a * rho
y0 = b * rho
x1 = int(x0 + 1000 * (-b))
y1 = int(y0 + 1000 * (a))
x2 = int(x0 - 1000 * (-b))
y2 = int(y0 - 1000 * (a))
y = min(y1 , y2)
if 150 <= y and y <= 300 and split_y > y:
split_y = y
split_y1 = y1
split_y2 = y2
split_x1 = x1
split_x2 = x2
split_theta = theta
cv2.line(img, (split_x1, split_y1), (split_x2, split_y2), (0, 0, 255), 3)
showWindow(img)
src = src[:split_y+15, :]
showWindow(src)
img_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
angleD = split_theta * 180.0 / np.pi
#print("angleD" + str(angleD))
if angleD <= 89 :
nCols , nRows = src.shape[:2]
src = image_rotate_newsize(src.copy() , (nCols // 2, nRows // 2), angleD - 90.0, 1.0)
showWindow(src)
img_rotated = image_rotate_newsize(img_gray.copy() , (nCols // 2, nRows // 2), angleD - 90.0, 1.0)
# print("img_rotated")
showWindow(img_rotated)
img_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
showWindow(img_gray)
img_blur = cv2.GaussianBlur(img_gray, (5, 5), 0)
showWindow(img_blur)
img_th3 = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
showWindow(img_th3)
kernel = np.ones((3, 3), np.uint8)
img_closing = cv2.morphologyEx(img_th3, cv2.MORPH_OPEN, kernel)
img_closing = cv2.morphologyEx(img_closing, cv2.MORPH_CLOSE, kernel)
showWindow(img_closing)
kernel = np.ones((7, 13), np.uint8)
img_open = cv2.morphologyEx(img_closing, cv2.MORPH_OPEN, kernel)
showWindow(img_open)
image, contours, hierarchy = cv2.findContours(img_open, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
src_height, src_width, c = src.shape
src_area = src_width * src_height
reslut_mu = None
reslut_img = None
img_rec = src.copy()
for i in range(len(contours)):
box = cv2.minAreaRect(contours[i])
x, y = box[0]
width, height = box[1]
if width < height:
t = width
width = height
height = t
angle = box[2]
rate = height / width
if rate < 1:
rate = width / height
area_rate = src_area / width / height
if 4 <= rate and rate <= 10 and 10 <= area_rate and area_rate <= 100:
angle = box[2]
img_now = src.copy()
points = np.int0(cv2.boxPoints(box))
cv2.drawContours(img_rec, [points], -1, 255, 0)
img_now = cv2.getRectSubPix(src.copy(), (int(width) + 10, 10 + int(height)), (int(x), int(y)))
showWindow(img_now)
s = chi_sim(img_now)
# print(s)
if s.find("mu") == 0 or s.find("MU") == 0 or s.find("E") == 0:
reslut_mu = s
# reslut_img = cv2.drawContours(src.copy(), [points], -1, 255, 0)
# print(str(s))
# cv2.imwrite("C:/Users/liyang/Desktop/ly/" + str(i) + ".PNG" , img_now)
if reslut_mu is not None:
return reslut_mu
# showWindow(reslut_img)
# zhfont1 = matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc')
# plt.title(reslut_mu , fontproperties=zhfont1)
# plt.imshow(reslut_img)
# plt.show()
return "failed"
if __name__ == '__main__':
img_path = sys.argv[1]
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
mu = recog(img_path) # IMG_4651.JPG
# reslut = {}
# reslut["status"] = "Yes"
# reslut["result"] = mu
# IMG_4567,IMG_4645
# IMG_4653
print(mu)
#coding:utf-8
import cv2
import numpy as np
import math
import sys
import os
from pyocr import pyocr
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib
import json
STEP = int(0)
def showWindow(img):
return
global STEP
STEP = STEP + 1
title = "step" + str(STEP)
cv2.namedWindow(title)
cv2.imshow(title, img)
cv2.waitKey(0)
cv2.destroyWindow(title)
def image_rotate_newsize(src, center , angle , scale) :
angle2 = angle * math.acos(-1.0) / 180
height , width = src.shape[:2]
alpha = math.cos(angle2) * scale
beta = math.sin(angle2) * scale
new_width = int(width * math.fabs(alpha) + height * math.fabs(beta))
new_height = int(width * math.fabs(beta) + height * math.fabs(alpha))
center = (float(width / 2), float(height / 2))
M = cv2.getRotationMatrix2D(center, angle, scale)
M[0][2] += int((new_width - width) / 2)
M[1][2] += int((new_height - height) / 2)
dst = cv2.warpAffine(src , M, (new_width, new_height) , borderValue = (255,255,255))
return dst
def chi_sim(src):
tools = pyocr.get_available_tools()[:]
if len(tools) == 0:
return "failed"
img = Image.fromarray(src)
str = tools[0].image_to_string(img, lang='eng')
if str == None or len(str) == 0:
return "failed"
str = str.replace(" " , "")
if str == None or len(str) == 0:
return "failed"
str = str.replace("%", "X").replace("x", "X")
if len(str) >= 18:
str = str[:18]
return str
def isIdcode(s):
if s == None or len(s) == 0:
return False
if len(s) != 18:
return False
for i in s:
if i == 'X' or i == 'x':
continue
if i < '0' or i > '9':
return False
return True
def is_chinese(s):
rt = False
if s >= u"\u4e00" and s <= u"\u9fa6":
rt = True
return rt
def s_is_chinese(s):
for i in s:
if not is_chinese(i):
return False
return True
def cmp(x , y):
if x < y:
return -1
if x == y:
return 0
if x > y:
return 1
if __name__ == '__main__':
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
img_path = sys.argv[1]
img_src = cv2.imread(img_path)#IMG_4751
showWindow(img_src)
img_src = cv2.resize(img_src, (85 * 8, 54 * 8), interpolation=cv2.INTER_CUBIC)
showWindow(img_src)
img_gray = cv2.cvtColor(img_src , cv2.COLOR_RGB2GRAY)
showWindow(img_gray)
img_blur = cv2.GaussianBlur(img_gray, (9, 9), 0)
showWindow(img_blur)
img_th3 = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 7, 7)
showWindow(img_th3)
kernel = np.ones((9, 21), np.uint8)
x = cv2.morphologyEx(img_th3, cv2.MORPH_CLOSE, kernel)
showWindow(x)
image, contours, hierarchy = cv2.findContours(x, cv2.RETR_EXTERNAL , cv2.CHAIN_APPROX_NONE)
s = cv2.drawContours(img_gray.copy(), contours, -1, (0, 0, 255), 3)
showWindow(s)
src_height, src_width = img_gray.shape[:2]
src_area = src_width * src_height
idcode = "Failed"
names = []
img_rec = img_gray.copy()
for i in range(len(contours)):
# if idcode != "Failed":
# continue
box = cv2.minAreaRect(contours[i])
x, y = box[0]
width, height = box[1]
if width == 0 or height == 0:
continue
if width < height:
t = width
width = height
height = t
angle = box[2]
rate = height / width
if rate < 1:
rate = width / height
area_rate = src_area / width / height
if rate < 10 or rate > 25 or area_rate < 10 or area_rate >= 1000:
continue
else:
# print(str(rate) + " " + str(area_rate))
angle = box[2]
img_now = img_gray.copy()
points = np.int0(cv2.boxPoints(box))
# cv2.drawContours(img_rec, [points], -1, 255, 0)
img_now = cv2.getRectSubPix(img_gray.copy(), (int(width) +15 , 20+int(height)), (int(x), int(y)))
# _, img_now = cv2.threshold(img_now , 0, 255, cv2.THRESH_OTSU)
# showWindow(img_now)
# nRows, nCols = img_now.shape[:2]
# M = cv2.getRotationMatrix2D((nCols / 2, nRows / 2), angle, 1)
# img_now = cv2.warpAffine(img_now, M, (nCols, nRows))
# showWindow(img_now)
# nRows , nCols = img_now.shape[:2]
# img_now = image_rotate_newsize(img_now.copy(), (nCols // 2, nRows // 2), angle, 1.0)
s = chi_sim(img_now)
if (s == None) or (len(s) == 0) :
continue
showWindow(img_now)
if isIdcode(s):
idcode = s
continue
print(json.dumps({"idcode":idcode , "name":"暂未提供"}))
#coding:utf-8
import cv2
import numpy as np
import math
import sys
import os
from pyocr import pyocr
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib
import json
import operator
STEP = int(0)
def showWindow(img):
return
global STEP
STEP = STEP + 1
title = "step" + str(STEP)
cv2.namedWindow(title)
cv2.imshow(title, img)
cv2.waitKey(0)
cv2.destroyWindow(title)
def image_rotate_newsize(src, center , angle , scale) :
angle2 = angle * math.acos(-1.0) / 180
height , width = src.shape[:2]
alpha = math.cos(angle2) * scale
beta = math.sin(angle2) * scale
new_width = int(width * math.fabs(alpha) + height * math.fabs(beta))
new_height = int(width * math.fabs(beta) + height * math.fabs(alpha))
center = (float(width / 2), float(height / 2))
M = cv2.getRotationMatrix2D(center, angle, scale)
M[0][2] += int((new_width - width) / 2)
M[1][2] += int((new_height - height) / 2)
dst = cv2.warpAffine(src , M, (new_width, new_height) , borderValue = (255,255,255))
return dst
def chi_sim(src):
tools = pyocr.get_available_tools()[:]
if len(tools) == 0:
return "failed"
img = Image.fromarray(src)
str = tools[0].image_to_string(img, lang='eng')
if str == None or len(str) == 0:
return "failed"
return str
def isIdcode(s):
if s == None or len(s) == 0:
return False
if len(s) != 4:
return False
for i in s:
if i < '0' or i > '9':
return False
return True
def is_chinese(s):
rt = False
if s >= u"\u4e00" and s <= u"\u9fa6":
rt = True
return rt
def s_is_chinese(s):
for i in s:
if not is_chinese(i):
return False
return True
def cmp(x , y):
if x < y:
return -1
if x == y:
return 0
if x > y:
return 1
if __name__ == '__main__':
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
img_path = sys.argv[1]
img_src = cv2.imread(img_path)#IMG_4771
# print(img_src.shape)
r , c = img_src.shape[:2]
img_src = img_src[int(r/2):,:]
showWindow(img_src)
img_src = cv2.resize(img_src, (int(600 ), int(400)), interpolation=cv2.INTER_CUBIC)
showWindow(img_src)
img_gray = cv2.cvtColor(img_src , cv2.COLOR_RGB2GRAY)
img_blur = cv2.GaussianBlur(img_gray, (7, 7), 0)
# showWindow(img_blur)
xxx = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 5)
showWindow(xxx)
# cv2.imwrite("C:/Users/liyang/Desktop/idcs/mu110.jpg" , xxx)
# print(chi_sim(xxx))
# exit(0)
# showWindow(img_gray)
# _simg = cv2.adaptiveThreshold(xxx, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, 7)
# showWindow(_simg)
# print(chi_sim(_simg))
img_blur = cv2.GaussianBlur(xxx, (5, 7), 0)
showWindow(img_blur)
img_th3 = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 7, 7)
showWindow(img_th3)
# print(chi_sim(img_th3))
kernel = np.ones((9, 15), np.uint8)
x = cv2.morphologyEx(img_th3, cv2.MORPH_CLOSE, kernel)
showWindow(x)
image, contours, hierarchy = cv2.findContours(x, cv2.RETR_EXTERNAL , cv2.CHAIN_APPROX_NONE)
s = cv2.drawContours(img_gray.copy(), contours, -1, (0, 0, 255), 3)
showWindow(s)
src_height, src_width = img_gray.shape[:2]
src_area = src_width * src_height
names = []
idcode = "Failed"
name = None
name_y = None
img_rec = img_gray.copy()
for i in range(len(contours)):
# if idcode != "Failed":
# continue
box = cv2.minAreaRect(contours[i])
x, y = box[0]
width, height = box[1]
if width == 0 or height == 0:
continue
if width < height:
t = width
width = height
height = t
angle = box[2]
rate = height / width
if rate < 1:
rate = width / height
area_rate = src_area / width / height
if rate < 1 or rate > 10 or area_rate < 50 or area_rate >= 1000:
continue
else:
# print(str(rate) + " " + str(area_rate))
angle = box[2]
img_now = img_gray.copy()
points = np.int0(cv2.boxPoints(box))
img_now = cv2.getRectSubPix(img_src.copy(), (int(width) +10 , 10+int(height)), (int(x), int(y)))
s = chi_sim(img_now)
# print(s)
showWindow(img_now)
if (s == None) or (len(s) == 0) or (s == "failed") :
continue
if isIdcode(s):
names.append({"name": s, "x": x, "y": y})
#
# print(names)
# if len(names) == 1:
# name = names[0].get("name")
# elif len(names) >= 2:
# names.sort(key=operator.itemgetter("y"))
# if len(names) == 3:
# name = names[1].get("name")
# else:
# name = names[0].get("name")
names.sort(key=operator.itemgetter("x"))
idcode = ""
for n in names:
idcode = idcode + n.get("name")
print(json.dumps({"idcode":idcode , "name":""}))
#coding:utf-8
import cv2
import numpy as np
import math
import sys
import os
from pyocr import pyocr
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib
import json
import operator
STEP = int(0)
def showWindow(img):
return
global STEP
STEP = STEP + 1
title = "step" + str(STEP)
cv2.namedWindow(title)
cv2.imshow(title, img)
cv2.waitKey(0)
cv2.destroyWindow(title)
def image_rotate_newsize(src, center , angle , scale) :
angle2 = angle * math.acos(-1.0) / 180
height , width = src.shape[:2]
alpha = math.cos(angle2) * scale
beta = math.sin(angle2) * scale
new_width = int(width * math.fabs(alpha) + height * math.fabs(beta))
new_height = int(width * math.fabs(beta) + height * math.fabs(alpha))
center = (float(width / 2), float(height / 2))
M = cv2.getRotationMatrix2D(center, angle, scale)
M[0][2] += int((new_width - width) / 2)
M[1][2] += int((new_height - height) / 2)
dst = cv2.warpAffine(src , M, (new_width, new_height) , borderValue = (255,255,255))
return dst
def chi_sim(src):
tools = pyocr.get_available_tools()[:]
if len(tools) == 0:
return "failed"
img = Image.fromarray(src)
str = tools[0].image_to_string(img, lang='eng')
if str == None or len(str) == 0:
return "failed"
str = str.replace("T" , "7").replace("B" , "8").replace("O" ,"0").replace("o" ,"0").replace("l" ,"1")
return str
def isIdcode(s):
if s == None or len(s) == 0:
return False
if len(s) != 13:
return False
for i in s:
if i < '0' or i > '9':
return False
return True
def is_chinese(s):
rt = False
if s >= u"\u4e00" and s <= u"\u9fa6":
rt = True
return rt
def s_is_chinese(s):
for i in s:
if not is_chinese(i):
return False
return True
def findFirst(s):
n = len(s)
if n < 13:
return -1
for i in range(n-13):
if isIdcode(s[i:i+13]):
return i
return -1
if __name__ == '__main__':
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
img_path = sys.argv[1]
img_src = cv2.imread(img_path)#IMG_4771
# print(img_src.shape)
# showWindow(img_src)
r , c = img_src.shape[:2]
# im_old = img_src.copy()[int(r*3/5):,:int(c*2/5)]
img_src = img_src[int(r*1/2):,:int(c*2/5)]
img_src = cv2.resize(img_src, (int(500), int(400)), interpolation=cv2.INTER_CUBIC)
# img_src = img_src[int(r*3/5):,:int(c*1/5)]
showWindow(img_src)
# print(img_src.shape)
# img_src = cv2.resize(img_src, (int(1200 ), int(500)), interpolation=cv2.INTER_CUBIC)
# showWindow(img_src)
img_gray = cv2.cvtColor(img_src , cv2.COLOR_RGB2GRAY)
#
img_blur = cv2.GaussianBlur(img_gray, (7, 7), 0)
# showWindow(img_blur)
xxx = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 5)
showWindow(xxx)
# cv2.imwrite("C:/Users/liyang/Desktop/idcs/mu110.jpg" , xxx)
# print(chi_sim(xxx))
# exit(0)
# showWindow(img_gray)
# _simg = cv2.adaptiveThreshold(xxx, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, 7)
# showWindow(_simg)
# print(chi_sim(_simg))
img_blur = cv2.GaussianBlur(xxx, (7,7), 0)
showWindow(img_blur)
img_th3 = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 5, 5)
showWindow(img_th3)
# print(chi_sim(img_th3))
kernel = np.ones((9, 15), np.uint8)
x = cv2.morphologyEx(img_th3, cv2.MORPH_CLOSE, kernel)
showWindow(x)
image, contours, hierarchy = cv2.findContours(x, cv2.RETR_EXTERNAL , cv2.CHAIN_APPROX_NONE)
s = cv2.drawContours(img_gray.copy(), contours, -1, (0, 0, 255), 3)
showWindow(s)
src_height, src_width = img_gray.shape[:2]
src_area = src_width * src_height
names = []
idcode = "Failed"
name = None
name_y = None
img_rec = img_gray.copy()
# print(len(contours))
for i in range(len(contours)):
# if idcode != "Failed":
# continue
box = cv2.minAreaRect(contours[i])
x, y = box[0]
width, height = box[1]
if width == 0 or height == 0:
continue
if width < height:
t = width
width = height
height = t
angle = box[2]
rate = height / width
if rate < 1:
rate = width / height
area_rate = src_area / width / height
if rate < 4 or rate > 20 or area_rate < 10 or area_rate >= 1000:
continue
else:
# print(str(rate) + " " + str(area_rate))
angle = box[2]
img_now = img_gray.copy()
points = np.int0(cv2.boxPoints(box))
img_now = cv2.getRectSubPix(img_src.copy(), (int(width) +10 , 10+int(height)), (int(x), int(y)))
s = chi_sim(img_now)
s = s.replace(" " , "")
# print(s)
fs = findFirst(s)
if fs != -1:
idcode = s[fs:fs+13]
showWindow(img_now)
#
# print(names)
# if len(names) == 1:
# name = names[0].get("name")
# elif len(names) >= 2:
# names.sort(key=operator.itemgetter("y"))
# if len(names) == 3:
# name = names[1].get("name")
# else:
# name = names[0].get("name")
print(json.dumps({"idcode":idcode , "name":""}))
#coding:utf-8
import cv2
import numpy as np
import math
import sys
import os
from pyocr import pyocr
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib
import json
import operator
STEP = int(0)
def showWindow(img):
return
global STEP
STEP = STEP + 1
title = "step" + str(STEP)
cv2.namedWindow(title)
cv2.imshow(title, img)
cv2.waitKey(0)
cv2.destroyWindow(title)
def image_rotate_newsize(src, center , angle , scale) :
angle2 = angle * math.acos(-1.0) / 180
height , width = src.shape[:2]
alpha = math.cos(angle2) * scale
beta = math.sin(angle2) * scale
new_width = int(width * math.fabs(alpha) + height * math.fabs(beta))
new_height = int(width * math.fabs(beta) + height * math.fabs(alpha))
center = (float(width / 2), float(height / 2))
M = cv2.getRotationMatrix2D(center, angle, scale)
M[0][2] += int((new_width - width) / 2)
M[1][2] += int((new_height - height) / 2)
dst = cv2.warpAffine(src , M, (new_width, new_height) , borderValue = (255,255,255))
return dst
def chi_sim(src):
tools = pyocr.get_available_tools()[:]
if len(tools) == 0:
return "failed"
img = Image.fromarray(src)
str = tools[0].image_to_string(img, lang='eng')
if str == None or len(str) == 0:
return "failed"
return str
def isIdcode(s):
if s == None or len(s) == 0:
return False
if len(s) != 8:
return False
for i in s:
if i < '0' or i > '9':
return False
return True
def is_chinese(s):
rt = False
if s >= u"\u4e00" and s <= u"\u9fa6":
rt = True
return rt
def s_is_chinese(s):
for i in s:
if not is_chinese(i):
return False
return True
def cmp(x , y):
if x < y:
return -1
if x == y:
return 0
if x > y:
return 1
if __name__ == '__main__':
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
img_path = sys.argv[1]
img_src = cv2.imread(img_path)#IMG_4771
# print(img_src.shape)
showWindow(img_src)
img_src = cv2.resize(img_src, (120 * 5 + 50, 100 * 5), interpolation=cv2.INTER_CUBIC)
showWindow(img_src)
img_gray = cv2.cvtColor(img_src , cv2.COLOR_RGB2GRAY)
showWindow(img_gray)
_simg = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 7)
showWindow(_simg)
img_blur = cv2.GaussianBlur(img_gray, (7, 7), 0)
showWindow(img_blur)
img_th3 = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 7, 7)
showWindow(img_th3)
kernel = np.ones((9, 17), np.uint8)
x = cv2.morphologyEx(img_th3, cv2.MORPH_CLOSE, kernel)
showWindow(x)
image, contours, hierarchy = cv2.findContours(x, cv2.RETR_EXTERNAL , cv2.CHAIN_APPROX_NONE)
s = cv2.drawContours(img_gray.copy(), contours, -1, (0, 0, 255), 3)
showWindow(s)
src_height, src_width = img_gray.shape[:2]
src_area = src_width * src_height
names = []
idcode = "Failed"
name = None
name_y = None
img_rec = img_gray.copy()
for i in range(len(contours)):
# if idcode != "Failed":
# continue
box = cv2.minAreaRect(contours[i])
x, y = box[0]
width, height = box[1]
if width == 0 or height == 0:
continue
if width < height:
t = width
width = height
height = t
angle = box[2]
rate = height / width
if rate < 1:
rate = width / height
area_rate = src_area / width / height
if rate < 5 or rate > 20 or area_rate < 50 or area_rate >= 1000:
continue
else:
# print(str(x) + " " + str(y))
angle = box[2]
img_now = img_gray.copy()
points = np.int0(cv2.boxPoints(box))
img_now = cv2.getRectSubPix(_simg.copy(), (int(width) +10 , 10+int(height)), (int(x), int(y)))
s = chi_sim(img_now)
if (s == None) or (len(s) == 0) or (s == "failed") :
continue
showWindow(img_now)
if isIdcode(s):
idcode = s
else:
s = s.replace("1" , "I")
names.append({"name": s, "x": x, "y": y})
# print(names)
if len(names) == 1:
name = names[0].get("name")
elif len(names) >= 2:
names.sort(key=operator.itemgetter("y"))
if len(names) == 3:
name = names[1].get("name")
else:
name = names[0].get("name")
print(json.dumps({"idcode":idcode , "name":name}))
#coding:utf-8
import cv2
import numpy as np
import math
import sys
import os
from pyocr import pyocr
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib
import json
import operator
STEP = int(0)
def showWindow(img):
return
global STEP
STEP = STEP + 1
title = "step" + str(STEP)
cv2.namedWindow(title)
cv2.imshow(title, img)
cv2.waitKey(0)
cv2.destroyWindow(title)
def image_rotate_newsize(src, center , angle , scale) :
angle2 = angle * math.acos(-1.0) / 180
height , width = src.shape[:2]
alpha = math.cos(angle2) * scale
beta = math.sin(angle2) * scale
new_width = int(width * math.fabs(alpha) + height * math.fabs(beta))
new_height = int(width * math.fabs(beta) + height * math.fabs(alpha))
center = (float(width / 2), float(height / 2))
M = cv2.getRotationMatrix2D(center, angle, scale)
M[0][2] += int((new_width - width) / 2)
M[1][2] += int((new_height - height) / 2)
dst = cv2.warpAffine(src , M, (new_width, new_height) , borderValue = (255,255,255))
return dst
def chi_sim(src):
tools = pyocr.get_available_tools()[:]
if len(tools) == 0:
return "failed"
img = Image.fromarray(src)
str = tools[0].image_to_string(img, lang='eng')
if str == None or len(str) == 0:
return "failed"
return str
def isIdcode(s):
if s == None or len(s) == 0:
return False
if len(s) != 13:
return False
for i in s:
if i < '0' or i > '9':
return False
return True
def is_chinese(s):
rt = False
if s >= u"\u4e00" and s <= u"\u9fa6":
rt = True
return rt
def s_is_chinese(s):
for i in s:
if not is_chinese(i):
return False
return True
def cmp(x , y):
if x < y:
return -1
if x == y:
return 0
if x > y:
return 1
if __name__ == '__main__':
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
img_path = sys.argv[1]
img_src = cv2.imread(img_path)#IMG_4771
# print(img_src.shape)
# showWindow(img_src)
r , c = img_src.shape[:2]
im_old = img_src.copy()[int(r*3/5):,:int(c*2/5)]
img_src = img_src[int(r*3/5):,:int(c*1/5)]
showWindow(img_src)
# print(img_src.shape)
# img_src = cv2.resize(img_src, (int(1200 ), int(500)), interpolation=cv2.INTER_CUBIC)
# showWindow(img_src)
img_gray = cv2.cvtColor(img_src , cv2.COLOR_RGB2GRAY)
# showWindow(img_gray)
ys = []
gray = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 180)
lines = cv2.HoughLines(edges, 1, np.pi / 180, 300)
lines1 = lines[:, 0, :]
for rho, theta in lines1[:]:
if (theta < (np.pi / 4.)) or (theta > (3. * np.pi / 4.0)):
continue
a = np.cos(theta)
b = np.sin(theta)
x0 = a * rho
y0 = b * rho
x1 = int(x0 + 1000 * (-b))
y1 = int(y0 + 1000 * (a))
x2 = int(x0 - 1000 * (-b))
y2 = int(y0 - 1000 * (a))
cv2.line(img_src, (x1, y1), (x2, y2), (0, 0, 255), 0)
# print(str(x1) + "," +str(y1) + " " +str(x1) + "," +str(y2) )
ys.append((y1+y2)//2)
# showWindow(img_src)
ys.sort()
# print(ys)
yod = []
n = len(ys)
sum_y = ys[0]
k = 1
for i in range(n):
if ys[i] - ys[i-1] < 10:
sum_y = sum_y + ys[i]
k += 1
else:
yod.append(sum_y // k)
sum_y = ys[i]
k = 1
yod.append(sum_y // k)
# print(yod)
im = im_old[yod[0]:yod[1],:]
r , c = im.shape[:2]
im = im[int(r*1/5):,:]
showWindow(im)
img_gray = cv2.cvtColor(im , cv2.COLOR_BGR2GRAY)
showWindow(img_gray)
# cv2.imwrite("C:/Users/liyang/Desktop/idcs/air0001ss.jpg" , im)
img_blur = cv2.GaussianBlur(img_gray, (7, 7), 0)
# showWindow(img_blur)
xxx = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 5)
showWindow(xxx)
# cv2.imwrite("C:/Users/liyang/Desktop/idcs/mu110.jpg" , xxx)
# print(chi_sim(xxx))
# exit(0)
# showWindow(img_gray)
# _simg = cv2.adaptiveThreshold(xxx, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, 7)
# showWindow(_simg)
# print(chi_sim(_simg))
img_blur = cv2.GaussianBlur(xxx, (7,7), 0)
showWindow(img_blur)
img_th3 = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 5, 5)
showWindow(img_th3)
# print(chi_sim(img_th3))
kernel = np.ones((9, 15), np.uint8)
x = cv2.morphologyEx(img_th3, cv2.MORPH_CLOSE, kernel)
showWindow(x)
image, contours, hierarchy = cv2.findContours(x, cv2.RETR_EXTERNAL , cv2.CHAIN_APPROX_NONE)
s = cv2.drawContours(img_gray.copy(), contours, -1, (0, 0, 255), 3)
showWindow(s)
src_height, src_width = img_gray.shape[:2]
src_area = src_width * src_height
names = []
idcode = "Failed"
name = None
name_y = None
img_rec = img_gray.copy()
# print(len(contours))
for i in range(len(contours)):
# if idcode != "Failed":
# continue
box = cv2.minAreaRect(contours[i])
x, y = box[0]
width, height = box[1]
if width == 0 or height == 0:
continue
if width < height:
t = width
width = height
height = t
angle = box[2]
rate = height / width
if rate < 1:
rate = width / height
area_rate = src_area / width / height
if 1>2:#rate < 1 or rate > 10 or area_rate < 50 or area_rate >= 1000:
continue
else:
# print(str(rate) + " " + str(area_rate))
angle = box[2]
img_now = img_gray.copy()
points = np.int0(cv2.boxPoints(box))
img_now = cv2.getRectSubPix(im.copy(), (int(width) +10 , 10+int(height)), (int(x), int(y)))
s = chi_sim(img_now)
# print(s)
showWindow(img_now)
if (s == None) or (len(s) == 0) or (s == "failed") :
continue
if isIdcode(s):
names.append({"name": s, "x": x, "y": y})
#
# print(names)
# if len(names) == 1:
# name = names[0].get("name")
# elif len(names) >= 2:
# names.sort(key=operator.itemgetter("y"))
# if len(names) == 3:
# name = names[1].get("name")
# else:
# name = names[0].get("name")
names.sort(key=operator.itemgetter("x"))
idcode = ""
for n in names:
idcode = idcode + n.get("name")
print(json.dumps({"idcode":idcode , "name":""}))
package com.ceair.api;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URLConnection;
import java.nio.charset.Charset;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.alibaba.fastjson.JSONObject;
import com.google.common.base.Strings;
import com.google.common.collect.Maps;
@Controller
public class ApiContorller {
@RequestMapping(value = "home")
public String homeWeb() {
int i = 1 ;
return "home";
}
@RequestMapping(value = "upload")
public String uploadWeb() {
return "upload";
}
@RequestMapping(value = "operate")
public String operateWeb() {
return "operate";
}
@RequestMapping(value = "/upload.do", produces = "text/html;charset=UTF-8" )
@ResponseBody
public Map<String , String> upload(
@RequestParam(value = "file", required = true) MultipartFile file,
HttpServletRequest request) throws IllegalStateException, IOException {
Map<String , String> map = Maps.newHashMap() ;
String path = request.getSession().getServletContext().getRealPath("upload");
File targetFile = new File(path, file.getOriginalFilename());
if (!targetFile.exists()) {
targetFile.mkdirs();
}
file.transferTo(targetFile);
map.put("status", "seccessed") ;
map.put("imgPath", targetFile.getAbsolutePath()) ;
map.put("imgSrc", "upload/" + file.getOriginalFilename()) ;
return map ;
}
@RequestMapping(value = "/flightSeatselectionRecog.do", produces = "text/html;charset=UTF-8" )
@ResponseBody
public Map<String , String> flightSeatselectionRecog(@RequestBody JSONObject param) throws IllegalStateException, IOException {
Map<String , String> map = Maps.newHashMap() ;
String imgPath = param.getString("imgPath") ;
String json = "" ;
try {
Process pr = Runtime.getRuntime().exec("python C:/iguardPy/laige_api.py " + imgPath) ;
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream() , "utf-8"));
String line;
while ((line = in.readLine()) != null) {
json += line ;
}
in.close();
pr.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
map.put("status", "seccessed") ;
map.put("mu_code", json) ;
return map ;
}
@RequestMapping(value = "/idcardRecog.do", produces = "text/html;charset=UTF-8" )
@ResponseBody
public Map<String , String> idcardRecog(@RequestBody JSONObject param) throws IllegalStateException, IOException {
Map<String , String> map = Maps.newHashMap() ;
String imgPath = param.getString("imgPath") ;
String json = "" ;
String idcode = "" ;
String name = "" ;
try {
Process pr = Runtime.getRuntime().exec("python C:/iguardPy/laige/idcard.py " + imgPath) ;
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream() , "utf-8"));
String line;
while ((line = in.readLine()) != null) {
json += new String(line.getBytes("iso-8859-1"),"utf-8") ;
}
JSONObject jo = JSONObject.parseObject(json) ;
idcode = jo.getString("idcode") ;
name = jo.getString("name") ;
in.close();
pr.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
map.put("status", "seccessed") ;
map.put("mu_msg", "身份证号 "+ idcode + " ,姓名 " + name) ;
return map ;
}
@RequestMapping(value = "/psscardRecog.do", produces = "text/html;charset=UTF-8" )
@ResponseBody
public Map<String , String> psscardRecog(@RequestBody JSONObject param) throws IllegalStateException, IOException {
Map<String , String> map = Maps.newHashMap() ;
String imgPath = param.getString("imgPath") ;
String json = "" ;
String idcode = "" ;
String name = "" ;
try {
Process pr = Runtime.getRuntime().exec("python C:/iguardPy/psscard.py " + imgPath) ;
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream() , "utf-8"));
String line;
while ((line = in.readLine()) != null) {
json += new String(line.getBytes("iso-8859-1"),"utf-8") ;
}
JSONObject jo = JSONObject.parseObject(json) ;
idcode = jo.getString("idcode") ;
name = jo.getString("name") ;
in.close();
pr.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
map.put("status", "seccessed") ;
map.put("mu_msg", "东航信息卡号 "+ idcode + " ,姓名 " + name) ;
return map ;
}
@RequestMapping(value = "/muEmbershipCardecog.do", produces = "text/html;charset=UTF-8" )
@ResponseBody
public Map<String , String> muEmbershipCardecog(@RequestBody JSONObject param) throws IllegalStateException, IOException {
Map<String , String> map = Maps.newHashMap() ;
String imgPath = param.getString("imgPath") ;
String json = "" ;
String idcode = "" ;
String name = "" ;
try {
Process pr = Runtime.getRuntime().exec("python C:/iguardPy/muEmbershipCard.py " + imgPath) ;
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream() , "utf-8"));
String line;
while ((line = in.readLine()) != null) {
json += new String(line.getBytes("iso-8859-1"),"utf-8") ;
}
JSONObject jo = JSONObject.parseObject(json) ;
idcode = jo.getString("idcode") ;
name = jo.getString("name") ;
in.close();
pr.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
map.put("status", "seccessed") ;
map.put("mu_msg", "东航会员卡号 "+ idcode + " ,姓名 " + name) ;
return map ;
}
@RequestMapping(value = "/airticketRecog.do", produces = "text/html;charset=UTF-8" )
@ResponseBody
public Map<String , String> airticketRecog(@RequestBody JSONObject param) throws IllegalStateException, IOException {
Map<String , String> map = Maps.newHashMap() ;
String imgPath = param.getString("imgPath") ;
String json = "" ;
String idcode = "" ;
String name = "" ;
try {
Process pr = Runtime.getRuntime().exec("python C:/iguardPy/airticket.py " + imgPath) ;
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream() , "utf-8"));
String line;
while ((line = in.readLine()) != null) {
json += new String(line.getBytes("iso-8859-1"),"utf-8") ;
}
JSONObject jo = JSONObject.parseObject(json) ;
idcode = jo.getString("idcode") ;
// name = jo.getString("name") ;
in.close();
pr.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
map.put("status", "seccessed") ;
map.put("mu_msg", "电子客票号 "+ idcode) ;
return map ;
}
@RequestMapping(value = "/muetktRecog.do", produces = "text/html;charset=UTF-8" )
@ResponseBody
public Map<String , String> muetktRecog(@RequestBody JSONObject param) throws IllegalStateException, IOException {
Map<String , String> map = Maps.newHashMap() ;
String imgPath = param.getString("imgPath") ;
String json = "" ;
String idcode = "" ;
String name = "" ;
try {
Process pr = Runtime.getRuntime().exec("python C:/iguardPy/muetkt.py " + imgPath) ;
BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream() , "utf-8"));
String line;
while ((line = in.readLine()) != null) {
json += new String(line.getBytes("iso-8859-1"),"utf-8") ;
}
JSONObject jo = JSONObject.parseObject(json) ;
idcode = jo.getString("idcode") ;
// name = jo.getString("name") ;
in.close();
pr.waitFor();
} catch (Exception e) {
e.printStackTrace();
}
map.put("status", "seccessed") ;
map.put("mu_msg", "电子客票号 "+ idcode) ;
return map ;
}
@RequestMapping(value="/download" )
public void downloadFile(String fileName , HttpServletRequest request , HttpServletResponse response) throws IOException {
String path = request.getSession().getServletContext().getRealPath("upload") ;
File file = new File(path , fileName) ;
if(!file.exists()){
String errorMessage = "Sorry. The file you are looking for does not exist";
OutputStream outputStream = response.getOutputStream();
outputStream.write(errorMessage.getBytes(Charset.forName("UTF-8")));
outputStream.close();
return;
}
String mimeType= URLConnection.guessContentTypeFromName(file.getName());
if(Strings.isNullOrEmpty(mimeType)){
mimeType = "application/octet-stream";
}
response.setContentType(mimeType);
response.setHeader("Content-Disposition", String.format("inline; filename=\"" + file.getName() +"\""));
response.setContentLength((int)file.length());
InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
FileCopyUtils.copy(inputStream, response.getOutputStream());
}
}
var app = angular.module("home.controller" , ["ngRoute" , "flightSeatselection.controller" , "idcard.controller" , "psscard.controller" , "muEmbershipCard.controller" , "airticket.controller" , "muetkt.controller"]) ;
app.config(function ($routeProvider) {
$routeProvider.
when('/home', {
templateUrl: './page/app/html/flightSeatselection.html',
controller: 'flightSeatselectionCtrl'
}).
when('/operate', {
templateUrl: './page/app/html/operate.html',
}).
when('/flightSeatselection', {
templateUrl: './page/app/html/flightSeatselection.html',
controller: 'flightSeatselectionCtrl'
}).
when('/idcard', {
templateUrl: './page/app/html/idcard.html',
controller: 'idcardCtrl'
}).
when('/psscard', {
templateUrl: './page/app/html/psscard.html',
controller: 'psscardCtrl'
}).
when('/muEmbershipCard', {
templateUrl: './page/app/html/muEmbershipCard.html',
controller: 'muEmbershipCardCtrl'
}).
when('/airticket', {
templateUrl: './page/app/html/airticket.html',
controller: 'airticketCtrl'
}).
when('/muetkt', {
templateUrl: './page/app/html/muetkt.html',
controller: 'muetktCtrl'
}).
otherwise({
redirectTo: '/home'
});
});
var app = angular.module("idcard.controller", []);
app.controller("idcardCtrl", ["$scope", '$http', '$q', function($scope, $http, $q) {
$scope.canDownload = false ;
$scope.errorMessge = false ;
$scope.save = function() {
$scope.img_path = null ;
$scope.mu_msg = "正在上传" ;
$scope.canDownload = false ;
$scope.errorMessge = false ;
var fd = new FormData();
var file = document.querySelector('input[type=file]').files[0];
fd.append('file', file);
$http({
method: 'POST',
url: "upload.do",
data: fd,
headers: { 'Content-Type': undefined },
transformRequest: angular.identity
})
.success(function(response) {
if(response.status == "seccessed"){
$scope.img_path = response.imgPath ;
$scope.imgSrc = response.imgSrc ;
$scope.mu_msg = "上传成功!" ;
}
else{
$scope.img_path = null ;
$scope.mu_msg = "上传失败!" ;
}
});
};
$scope.idcardRecog = function() {
if($scope.img_path == null ){
alert("请上传!") ;
return ;
}
$scope.mu_msg = "正在识别..." ;
$scope.canDownload = false ;
$scope.errorMessge = false ;
$http({
method: 'POST',
url: "idcardRecog.do",
data: {imgPath:$scope.img_path}
})
.success(function(response) {
if(response.status == "seccessed"){
$scope.mu_msg = "识别结果:" + response.mu_msg ;
}
else{
$scope.mu_msg = "未能识别!" ;
}
});
};
$scope.downloadServerDetailList = function(fileName) {
$http.get("download?fileName=" + $scope.fileName , { responseType: 'arraybuffer' })
.success(function(data, status, headers) {
var octetStreamMime = 'application/octet-stream';
var success = false;
headers = headers();
var filename = headers['x-filename'] || $scope.fileName ;
var contentType = headers['content-type'] || octetStreamMime ;
try {
var blob = new Blob([data], { type: contentType });
if(navigator.msSaveBlob)
navigator.msSaveBlob(blob, filename);
else {
var saveBlob = navigator.webkitSaveBlob || navigator.mozSaveBlob || navigator.saveBlob;
if(saveBlob === undefined) throw "Not supported";
saveBlob(blob, filename);
}
success = true;
} catch(ex) {}
if(!success) {
var urlCreator = window.URL || window.webkitURL || window.mozURL || window.msURL;
if(urlCreator) {
var link = document.createElement('a');
if('download' in link) {
try {
var blob = new Blob([data], { type: contentType });
var url = urlCreator.createObjectURL(blob);
link.setAttribute('href', url);
link.setAttribute("download", filename);
var event = document.createEvent('MouseEvents');
event.initMouseEvent('click', true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
link.dispatchEvent(event);
success = true;
} catch(ex) {
console.log(ex);
}
}
if(!success) {
try {
var blob = new Blob([data], { type: octetStreamMime });
var url = urlCreator.createObjectURL(blob);
window.location = url;
success = true;
} catch(ex) {
console.log(ex);
}
}
}
}
if(!success) {
window.open(httpPath, '_blank', '');
}
})
.error(function(data, status) {
console.log("Request failed with status: " + status);
$scope.errorDetails = "Request failed with status: " + status;
});
};
}]);
<!DOCTYPE html>
<html ng-app="home.controller">
<head>
<meta charset="utf-8">
<title></title>
<link href="page/common/css/bootstrap.min.css" rel="stylesheet">
<script src="page/common/js/angular.js"></script>
<script src="page/common/js/angular-animate.min.js"></script>
<script src="page/common/js/angular-route.min.js"></script>
<script src="page/app/js/home-controller.js"></script>
<script src="page/app/js/flightSeatselection-controller.js"></script>
<script src="page/app/js/idcard-controller.js"></script>
<script src="page/app/js/psscard-controller.js"></script>
<script src="page/app/js/muEmbershipCard-controller.js"></script>
<script src="page/app/js/airticket-controller.js"></script>
<script src="page/app/js/muetkt-controller.js"></script>
</head>
<body>
<div class="navbar navbar-inverse">
<a class="navbar-brand" href="#/home"></a>
</div>
<div class="panel panel-default row">
<div class="col-xs-2">
<ul class="nav nav-stacked">
<li><a href="#/flightSeatselection"></a></li>
<li><a href="#/idcard"></a></li>
<li><a href="#/psscard"></a></li>
<li><a href="#/muEmbershipCard"></a></li>
<li><a href="#/airticket"></a></li>
<li><a href="#/muetkt"></a></li>
</ul>
</div>
<div class="col-xs-8">
<div ng-view=""></div>
</div>
</div>
</body>
</html>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">选择...图像</h3>
</div>
<div class="panel-body">
<input type="file" file-model="myFile">
<div class="btn-group">
<button type="button" class="btn btn-primary" ng-click="save()">上传</button>
<button type="button" class="btn btn-primary" ng-click="idcardRecog()">识别</button>
</div>
<div class="alert alert-danger">
{{mu_msg}}
</div>
<br>
<img alt="" src="{{imgSrc}}" width="800" height="800">
<div ng-show="canDownload">
<h2> <a href="" ng-click="downloadServerDetailList()">{{fileName}}</a> </h2>
</div>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
</div>
</div>