优化涂抹的匹配与方向判断
This commit is contained in:
@@ -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:
|
|
||||||
if name in layout[1]:
|
|
||||||
result += find_boxes(name, layout, improve=True, image_path=temp_file.name)
|
|
||||||
find_name_by_key = False
|
|
||||||
break
|
|
||||||
if find_name_by_key and name_len > 2:
|
|
||||||
matches = re.findall(r, layout[1])
|
matches = re.findall(r, layout[1])
|
||||||
for match in matches:
|
for match in matches:
|
||||||
if match in layout[1]:
|
result += find_boxes(match, layout, improve=True, image_path=temp_file.name, extra_content=r)
|
||||||
result += find_boxes(match, layout, improve=True, image_path=temp_file.name,
|
|
||||||
extra_content=name_list)
|
|
||||||
find_name_by_key = False
|
find_name_by_key = False
|
||||||
break
|
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,18 +172,15 @@ 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)
|
||||||
image = image_util.read(img_url)
|
|
||||||
# image = image_util.rotate(image, 180)
|
|
||||||
split_results = image_util.split(image)
|
|
||||||
for split_result in split_results:
|
for split_result in split_results:
|
||||||
to_mask_img, x_offset, y_offset = handle_image_for_mask(split_result)
|
to_mask_img, x_offset, y_offset = handle_image_for_mask(split_result)
|
||||||
results = get_mask_layout(to_mask_img, name, id_card_num)
|
results = get_mask_layout(to_mask_img, n, icn)
|
||||||
|
|
||||||
if results:
|
if results:
|
||||||
is_masked = True
|
do_mask = True
|
||||||
|
|
||||||
for result in results:
|
for result in results:
|
||||||
result = (
|
result = (
|
||||||
@@ -196,7 +189,24 @@ def mask_photo(img_url, name, id_card_num, color=(255, 255, 255)):
|
|||||||
result[2] + x_offset,
|
result[2] + x_offset,
|
||||||
result[3] + y_offset,
|
result[3] + y_offset,
|
||||||
)
|
)
|
||||||
cv2.rectangle(image, (int(result[0]), int(result[1])), (int(result[2]), int(result[3])), color, -1, 0)
|
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)
|
||||||
|
original_image = image
|
||||||
|
is_masked, image = _mask(image, name, id_card_num, color)
|
||||||
|
if not is_masked:
|
||||||
|
# 如果没有涂抹,可能是图片方向不对
|
||||||
|
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
|
||||||
|
|
||||||
return is_masked, image
|
return is_masked, image
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user