From c40052bbf2c0f30c5344e598ce46b295feffbe35 Mon Sep 17 00:00:00 2001 From: liuwenzhe <645648512@qq.com> Date: Tue, 28 May 2024 20:27:18 +0800 Subject: [PATCH] daima0528 --- python/p/kcsj.py | 139 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) diff --git a/python/p/kcsj.py b/python/p/kcsj.py index 48d5264..22b5d4a 100644 --- a/python/p/kcsj.py +++ b/python/p/kcsj.py @@ -121,3 +121,142 @@ for i,j in enumerate(word_images): plt.imshow(word_images[i],cmap='gray') plt.show() +#模版匹配 +# 准备模板(template[0-9]为数字模板;) +template = ['0','1','2','3','4','5','6','7','8','9', + 'A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z', + '藏','川','鄂','甘','赣','贵','桂','黑','沪','吉','冀','津','晋','京','辽','鲁','蒙','闽','宁', + '青','琼','陕','苏','皖','湘','新','渝','豫','粤','云','浙'] + +# 读取一个文件夹下的所有图片,输入参数是文件名,返回模板文件地址列表 +def read_directory(directory_name): + referImg_list = [] + for filename in os.listdir(directory_name): + referImg_list.append(directory_name + "/" + filename) + return referImg_list + +# 获得中文模板列表(只匹配车牌的第一个字符) +def get_chinese_words_list(): + chinese_words_list = [] + for i in range(34,64): + #将模板存放在字典中 + c_word = read_directory('./refer1/'+ template[i]) + chinese_words_list.append(c_word) + return chinese_words_list +chinese_words_list = get_chinese_words_list() + + +# 获得英文模板列表(只匹配车牌的第二个字符) +def get_eng_words_list(): + eng_words_list = [] + for i in range(10,34): + e_word = read_directory('./refer1/'+ template[i]) + eng_words_list.append(e_word) + return eng_words_list +eng_words_list = get_eng_words_list() + + +# 获得英文和数字模板列表(匹配车牌后面的字符) +def get_eng_num_words_list(): + eng_num_words_list = [] + for i in range(0,34): + word = read_directory('./refer1/'+ template[i]) + eng_num_words_list.append(word) + return eng_num_words_list +eng_num_words_list = get_eng_num_words_list() + + +# 读取一个模板地址与图片进行匹配,返回得分 +def template_score(template,image): + #将模板进行格式转换 + template_img=cv2.imdecode(np.fromfile(template,dtype=np.uint8),1) + template_img = cv2.cvtColor(template_img, cv2.COLOR_RGB2GRAY) + #模板图像阈值化处理——获得黑白图 + ret, template_img = cv2.threshold(template_img, 0, 255, cv2.THRESH_OTSU) +# height, width = template_img.shape +# image_ = image.copy() +# image_ = cv2.resize(image_, (width, height)) + image_ = image.copy() + #获得待检测图片的尺寸 + height, width = image_.shape + # 将模板resize至与图像一样大小 + template_img = cv2.resize(template_img, (width, height)) + # 模板匹配,返回匹配得分 + result = cv2.matchTemplate(image_, template_img, cv2.TM_CCOEFF) + return result[0][0] + + +# 对分割得到的字符逐一匹配 +def template_matching(word_images): + results = [] + for index,word_image in enumerate(word_images): + if index==0: + best_score = [] + for chinese_words in chinese_words_list: + score = [] + for chinese_word in chinese_words: + result = template_score(chinese_word,word_image) + score.append(result) + best_score.append(max(score)) + i = best_score.index(max(best_score)) + # print(template[34+i]) + r = template[34+i] + results.append(r) + continue + if index==1: + best_score = [] + for eng_word_list in eng_words_list: + score = [] + for eng_word in eng_word_list: + result = template_score(eng_word,word_image) + score.append(result) + best_score.append(max(score)) + i = best_score.index(max(best_score)) + # print(template[10+i]) + r = template[10+i] + results.append(r) + continue + else: + best_score = [] + for eng_num_word_list in eng_num_words_list: + score = [] + for eng_num_word in eng_num_word_list: + result = template_score(eng_num_word,word_image) + score.append(result) + best_score.append(max(score)) + i = best_score.index(max(best_score)) + # print(template[i]) + r = template[i] + results.append(r) + continue + return results + + +word_images_ = word_images.copy() +# 调用函数获得结果 +result = template_matching(word_images_) +print(result) +# "".join(result)函数将列表转换为拼接好的字符串,方便结果显示 +print( "".join(result)) + +from PIL import ImageFont, ImageDraw, Image + +height,weight = origin_image.shape[0:2] +print(height) +print(weight) + +image_1 = origin_image.copy() +cv2.rectangle(image_1, (int(0.2*weight), int(0.75*height)), (int(weight*0.9), int(height*0.95)), (0, 255, 0), 5) + +#设置需要显示的字体 +fontpath = "font/simsun.ttc" +font = ImageFont.truetype(fontpath,64) +img_pil = Image.fromarray(image_1) +draw = ImageDraw.Draw(img_pil) + +#绘制文字信息 +draw.text((int(0.2*weight)+25, int(0.75*height)), "".join(result), font = font, fill = (255, 255, 0)) +bk_img = np.array(img_pil) +print(result) +print( "".join(result)) +plt_show0(bk_img)