优化涂抹的匹配与方向判断

This commit is contained in:
2024-07-30 10:55:31 +08:00
parent ecf26c1bf6
commit 5054fdd582

View File

@@ -67,12 +67,13 @@ def find_boxes(content, layout, offset=0, length=None, improve=False, image_path
except Exception as e: except Exception as e:
# 如果出现其他错误,抛出 # 如果出现其他错误,抛出
raise e raise e
if extra_content:
extra_content.append(content)
else:
extra_content = [content]
for layout in layouts: for layout in layouts:
for c in extra_content: if extra_content:
matches = re.findall(extra_content, layout[1])
else:
matches = [content]
for c in matches:
if c in layout[1]: if c in layout[1]:
temp_box = find_boxes(c, layout)[0] temp_box = find_boxes(c, layout)[0]
if temp_box: if temp_box:
@@ -110,36 +111,31 @@ def get_mask_layout(image, name, id_card_num):
# 无识别结果 # 无识别结果
return result return result
else: else:
# 处理形近字 re_list = []
name_list = [name] for char in name:
# 移除名字中重复的字 char_re = f"{char}"
unique_name = "".join(dict.fromkeys(name))
for char in unique_name:
if char in SIMILAR_CHAR: if char in SIMILAR_CHAR:
for sc in SIMILAR_CHAR[char]: char_re += "|" + "|".join(SIMILAR_CHAR[char])
name_list.append(name.replace(char, sc)) re_list.append(char_re)
name_len = len(name) name_len = len(name)
name_offset = int(name_len / 2) name_offset = int(name_len / 2)
r = f"{name[:-1]}.?|.?{name[1:]}" + ( if name_len > 2:
f"|{name[:name_offset]}.?{name[-name_offset:]}" if (name_len & 1) == 1 else "") r = f"[{']['.join(re_list[:-1])}].?|.?[{']['.join(re_list[1:])}]"
else:
r = f"[{']['.join(re_list)}]"
if (name_len & 1) == 1:
r += f"|[{']['.join(re_list[:name_offset])}].?[{']['.join(re_list[-name_offset:])}]"
for layout in layouts: for layout in layouts:
find_name_by_key = True find_name_by_key = True
find_id_card_num_by_key = True find_id_card_num_by_key = True
for name in name_list: matches = re.findall(r, layout[1])
if name in layout[1]: for match in matches:
result += find_boxes(name, layout, improve=True, image_path=temp_file.name) result += find_boxes(match, layout, improve=True, image_path=temp_file.name, extra_content=r)
find_name_by_key = False find_name_by_key = False
break break
if find_name_by_key and name_len > 2:
matches = re.findall(r, layout[1])
for match in matches:
if match in layout[1]:
result += find_boxes(match, layout, improve=True, image_path=temp_file.name,
extra_content=name_list)
find_name_by_key = False
break
if id_card_num in layout[1]: if id_card_num in layout[1]:
result += find_boxes(id_card_num, layout, improve=True, image_path=temp_file.name) result += find_boxes(id_card_num, layout, improve=True, image_path=temp_file.name)
find_id_card_num_by_key = False find_id_card_num_by_key = False
@@ -176,27 +172,41 @@ def handle_image_for_mask(split_result):
def mask_photo(img_url, name, id_card_num, color=(255, 255, 255)): def mask_photo(img_url, name, id_card_num, color=(255, 255, 255)):
# 是否涂抹了 def _mask(i, n, icn, c):
is_masked = False do_mask = False
split_results = image_util.split(i)
for split_result in split_results:
to_mask_img, x_offset, y_offset = handle_image_for_mask(split_result)
results = get_mask_layout(to_mask_img, n, icn)
if results:
do_mask = True
for result in results:
result = (
result[0] + x_offset,
result[1] + y_offset,
result[2] + x_offset,
result[3] + y_offset,
)
cv2.rectangle(i, (int(result[0]), int(result[1])), (int(result[2]), int(result[3])), c, -1, 0)
return do_mask, i
# 打开图片 # 打开图片
image = image_util.read(img_url) image = image_util.read(img_url)
# image = image_util.rotate(image, 180) original_image = image
split_results = image_util.split(image) is_masked, image = _mask(image, name, id_card_num, color)
for split_result in split_results: if not is_masked:
to_mask_img, x_offset, y_offset = handle_image_for_mask(split_result) # 如果没有涂抹,可能是图片方向不对
results = get_mask_layout(to_mask_img, name, id_card_num) angles = image_util.parse_rotation_angles(image)
angle = angles[0]
if angle != "0":
image = image_util.rotate(image, int(angle))
is_masked, image = _mask(image, name, id_card_num, color)
if not is_masked:
# 如果旋转后也没有涂抹,恢复原来的方向
image = original_image
if results:
is_masked = True
for result in results:
result = (
result[0] + x_offset,
result[1] + y_offset,
result[2] + x_offset,
result[3] + y_offset,
)
cv2.rectangle(image, (int(result[0]), int(result[1])), (int(result[2]), int(result[3])), color, -1, 0)
return is_masked, image return is_masked, image