add position
Showing
1 changed file
with
130 additions
and
17 deletions
| ... | @@ -298,14 +298,26 @@ class Command(BaseCommand, LoggerMixin): | ... | @@ -298,14 +298,26 @@ class Command(BaseCommand, LoggerMixin): |
| 298 | # rebuild_data_dict[detail_dict.get('chinese_key', '')] = detail_dict.get('words', '') | 298 | # rebuild_data_dict[detail_dict.get('chinese_key', '')] = detail_dict.get('words', '') |
| 299 | # return [rebuild_data_dict] | 299 | # return [rebuild_data_dict] |
| 300 | 300 | ||
| 301 | 301 | def license1_process(self, ocr_data, license_summary, classify, res_list, pno, ino, part_idx, img_path, do_dda, | |
| 302 | 302 | dda_id_bc_mapping): | |
| 303 | def license1_process(self, ocr_data, license_summary, classify, res_list, pno, ino, part_idx, img_path, do_dda, dda_id_bc_mapping): | ||
| 304 | # 类别:'0'身份证, '1'居住证 | 303 | # 类别:'0'身份证, '1'居住证 |
| 305 | license_data = ocr_data.get('data') | 304 | license_data = ocr_data.get('data') |
| 306 | if not license_data: | 305 | if not license_data: |
| 307 | res_list.append((pno, ino, part_idx, consts.RES_SUCCESS_EMPTY)) | 306 | res_list.append((pno, ino, part_idx, consts.RES_SUCCESS_EMPTY)) |
| 308 | return | 307 | return |
| 308 | pre, suf = os.path.splitext(img_path) | ||
| 309 | base64_img = license_data.pop('base64_img', '') | ||
| 310 | is_save = True if len(base64_img) > 0 else False | ||
| 311 | section_img_path = '{0}_{1}{2}'.format(pre, part_idx, suf) if is_save else img_path | ||
| 312 | if is_save: | ||
| 313 | try: | ||
| 314 | with open(section_img_path, "wb") as fh: | ||
| 315 | fh.write(base64.b64decode(base64_img.encode())) | ||
| 316 | except Exception as e: | ||
| 317 | self.online_log.warn( | ||
| 318 | '{0} [section img save failed] [img_path={1}]' | ||
| 319 | ' [part_idx={2}]'.format(self.log_base, img_path, part_idx)) | ||
| 320 | |||
| 309 | # 保单 | 321 | # 保单 |
| 310 | if classify == consts.INSURANCE_CLASSIFY: | 322 | if classify == consts.INSURANCE_CLASSIFY: |
| 311 | product_result = ['', '', ''] | 323 | product_result = ['', '', ''] |
| ... | @@ -333,7 +345,13 @@ class Command(BaseCommand, LoggerMixin): | ... | @@ -333,7 +345,13 @@ class Command(BaseCommand, LoggerMixin): |
| 333 | '保险截止日期': license_data.get('result', {}).get('endDate', {}).get('words', ''), | 345 | '保险截止日期': license_data.get('result', {}).get('endDate', {}).get('words', ''), |
| 334 | '保单章': license_data.get('result', {}).get('seal', {}).get('words', ''), | 346 | '保单章': license_data.get('result', {}).get('seal', {}).get('words', ''), |
| 335 | '特别约定第一受益人': special, | 347 | '特别约定第一受益人': special, |
| 348 | consts.IMG_PATH_KEY: img_path, | ||
| 349 | consts.SECTION_IMG_PATH_KEY: section_img_path, | ||
| 336 | } | 350 | } |
| 351 | # position_dict = { | ||
| 352 | # '': {consts.FIELD_POSITION_KEY: {}} | ||
| 353 | # } | ||
| 354 | # insurance_ocr_result[consts.ALL_POSITION_KEY] = position_dict | ||
| 337 | license_summary.setdefault(classify, []).append(insurance_ocr_result) | 355 | license_summary.setdefault(classify, []).append(insurance_ocr_result) |
| 338 | # DDA | 356 | # DDA |
| 339 | elif classify == consts.DDA_CLASSIFY: | 357 | elif classify == consts.DDA_CLASSIFY: |
| ... | @@ -341,37 +359,103 @@ class Command(BaseCommand, LoggerMixin): | ... | @@ -341,37 +359,103 @@ class Command(BaseCommand, LoggerMixin): |
| 341 | if pro < consts.DDA_PRO_MIN: | 359 | if pro < consts.DDA_PRO_MIN: |
| 342 | res_list.append((pno, ino, part_idx, consts.RES_SUCCESS_EMPTY)) | 360 | res_list.append((pno, ino, part_idx, consts.RES_SUCCESS_EMPTY)) |
| 343 | return | 361 | return |
| 344 | dda_ocr_result = {key: value.get('words', '') for key, value in license_data.get('result', {}).items()} | 362 | dda_ocr_result = {} |
| 363 | position_dict = {} | ||
| 364 | for key, value in license_data.get('result', {}).items(): | ||
| 365 | dda_ocr_result[key] = value.get('words', '') | ||
| 366 | position_dict[key] = { | ||
| 367 | consts.FIELD_POSITION_KEY: value.get('position', {}) | ||
| 368 | } | ||
| 345 | dda_ocr_result[consts.DDA_IMG_PATH] = img_path | 369 | dda_ocr_result[consts.DDA_IMG_PATH] = img_path |
| 346 | dda_ocr_result[consts.DDA_PRO] = pro | 370 | dda_ocr_result[consts.DDA_PRO] = pro |
| 347 | dda_ocr_result[consts.IMG_PATH_KEY] = img_path | 371 | dda_ocr_result[consts.IMG_PATH_KEY] = img_path |
| 372 | dda_ocr_result[consts.SECTION_IMG_PATH_KEY] = section_img_path | ||
| 373 | dda_ocr_result[consts.ALL_POSITION_KEY] = position_dict | ||
| 348 | license_summary.setdefault(classify, []).append(dda_ocr_result) | 374 | license_summary.setdefault(classify, []).append(dda_ocr_result) |
| 349 | # 抵押登记豁免函 | 375 | # 抵押登记豁免函 |
| 350 | elif classify == consts.HMH_CLASSIFY: | 376 | elif classify == consts.HMH_CLASSIFY: |
| 351 | hmh_ocr_result = {key: value.get('words', '') for key, value in license_data.get('words_result', {}).items()} | 377 | hmh_ocr_result = {} |
| 378 | position_dict = {} | ||
| 379 | for key, value in license_data.get('words_result', {}).items(): | ||
| 380 | hmh_ocr_result[key] = value.get('words', '') | ||
| 381 | location_list = value.get('location', [-1, -1, -1, -1]) | ||
| 382 | if len(location_list) == 4: | ||
| 383 | position_dict[key] = { | ||
| 384 | consts.FIELD_POSITION_KEY: { | ||
| 385 | 'top': location_list[1], | ||
| 386 | 'left': location_list[0], | ||
| 387 | 'height': location_list[-1] - location_list[1], | ||
| 388 | 'width': location_list[2] - location_list[0] | ||
| 389 | } | ||
| 390 | } | ||
| 391 | hmh_ocr_result[consts.IMG_PATH_KEY] = img_path | ||
| 392 | hmh_ocr_result[consts.SECTION_IMG_PATH_KEY] = section_img_path | ||
| 393 | hmh_ocr_result[consts.ALL_POSITION_KEY] = position_dict | ||
| 352 | license_summary.setdefault(classify, []).append(hmh_ocr_result) | 394 | license_summary.setdefault(classify, []).append(hmh_ocr_result) |
| 353 | # 二手车交易凭证 | 395 | # 二手车交易凭证 |
| 354 | elif classify == consts.JYPZ_CLASSIFY: | 396 | elif classify == consts.JYPZ_CLASSIFY: |
| 355 | jypz_ocr_result = {key: value.get('words', '') for key, value in license_data.get('result', {}).items()} | 397 | jypz_ocr_result = {} |
| 398 | position_dict = {} | ||
| 399 | for key, value in license_data.get('result', {}).items(): | ||
| 400 | jypz_ocr_result[key] = value.get('words', '') | ||
| 401 | position_dict[key] = { | ||
| 402 | consts.FIELD_POSITION_KEY: value.get('position', {}) | ||
| 403 | } | ||
| 404 | jypz_ocr_result[consts.IMG_PATH_KEY] = img_path | ||
| 405 | jypz_ocr_result[consts.SECTION_IMG_PATH_KEY] = section_img_path | ||
| 406 | jypz_ocr_result[consts.ALL_POSITION_KEY] = position_dict | ||
| 356 | license_summary.setdefault(classify, []).append(jypz_ocr_result) | 407 | license_summary.setdefault(classify, []).append(jypz_ocr_result) |
| 357 | # 车辆登记证 3/4页结果整合 | 408 | # 车辆登记证 3/4页结果整合 |
| 358 | elif classify == consts.MVC_CLASSIFY: | 409 | elif classify == consts.MVC_CLASSIFY: |
| 359 | rebuild_data_dict = {} | 410 | rebuild_data_dict = {} |
| 411 | position_dict = {} | ||
| 360 | rebuild_data_dict[consts.IMG_PATH_KEY] = img_path | 412 | rebuild_data_dict[consts.IMG_PATH_KEY] = img_path |
| 413 | rebuild_data_dict[consts.SECTION_IMG_PATH_KEY] = section_img_path | ||
| 361 | mvc_page = license_data.pop('page', 'VehicleRCI') | 414 | mvc_page = license_data.pop('page', 'VehicleRCI') |
| 362 | mvc_res = license_data.pop('results', {}) | 415 | mvc_res = license_data.pop('results', {}) |
| 363 | if mvc_page == 'VehicleRegArea': | 416 | if mvc_page == 'VehicleRegArea': |
| 364 | rebuild_data_dict['机动车登记证书编号'] = mvc_res.get('机动车登记证书编号', {}).get('words', '') | 417 | rebuild_data_dict['机动车登记证书编号'] = mvc_res.get('机动车登记证书编号', {}).get('words', '') |
| 418 | code_position_list = mvc_res.get('机动车登记证书编号', {}).get('position', [0, 0, 0, 0]) | ||
| 419 | if len(code_position_list) == 4: | ||
| 420 | position_dict['机动车登记证书编号'] = { | ||
| 421 | consts.FIELD_POSITION_KEY: { | ||
| 422 | 'top': code_position_list[1], | ||
| 423 | 'left': code_position_list[0], | ||
| 424 | 'height': code_position_list[-1], | ||
| 425 | 'width': code_position_list[2], | ||
| 426 | } | ||
| 427 | } | ||
| 365 | for register_info in mvc_res.get('登记信息', []): | 428 | for register_info in mvc_res.get('登记信息', []): |
| 366 | register_info.pop('register_type', None) | 429 | register_info.pop('register_type', None) |
| 367 | register_info.pop('register_type_name', None) | 430 | register_info.pop('register_type_name', None) |
| 368 | for cn_key, detail_dict in register_info.items(): | 431 | for cn_key, detail_dict in register_info.items(): |
| 369 | rebuild_data_dict.setdefault(cn_key, []).append( | 432 | rebuild_data_dict.setdefault(cn_key, []).append( |
| 370 | detail_dict.get('words', '')) | 433 | detail_dict.get('words', '')) |
| 434 | tmp_position_list = detail_dict.get('position', [0, 0, 0, 0]) | ||
| 435 | if len(tmp_position_list) == 4: | ||
| 436 | position_dict[cn_key] = { | ||
| 437 | consts.FIELD_POSITION_KEY: { | ||
| 438 | 'top': tmp_position_list[1], | ||
| 439 | 'left': tmp_position_list[0], | ||
| 440 | 'height': tmp_position_list[-1], | ||
| 441 | 'width': tmp_position_list[2], | ||
| 442 | } | ||
| 443 | } | ||
| 371 | else: | 444 | else: |
| 372 | for cn_key, detail_dict in mvc_res.items(): | 445 | for cn_key, detail_dict in mvc_res.items(): |
| 373 | rebuild_data_dict[cn_key] = detail_dict.get('words', '') | 446 | rebuild_data_dict[cn_key] = detail_dict.get('words', '') |
| 447 | position_list = detail_dict.get('position', [0, 0, 0, 0]) | ||
| 448 | if len(position_list) == 4: | ||
| 449 | position_dict[cn_key] = { | ||
| 450 | consts.FIELD_POSITION_KEY: { | ||
| 451 | 'top': position_list[1], | ||
| 452 | 'left': position_list[0], | ||
| 453 | 'height': position_list[-1], | ||
| 454 | 'width': position_list[2], | ||
| 455 | } | ||
| 456 | } | ||
| 374 | del mvc_res | 457 | del mvc_res |
| 458 | rebuild_data_dict[consts.ALL_POSITION_KEY] = position_dict | ||
| 375 | license_summary.setdefault(classify, []).append(rebuild_data_dict) | 459 | license_summary.setdefault(classify, []).append(rebuild_data_dict) |
| 376 | 460 | ||
| 377 | 461 | ||
| ... | @@ -395,6 +479,7 @@ class Command(BaseCommand, LoggerMixin): | ... | @@ -395,6 +479,7 @@ class Command(BaseCommand, LoggerMixin): |
| 395 | # 身份证真伪 | 479 | # 身份证真伪 |
| 396 | elif classify == consts.IC_CLASSIFY: | 480 | elif classify == consts.IC_CLASSIFY: |
| 397 | id_card_dict = {} | 481 | id_card_dict = {} |
| 482 | position_dict = {} | ||
| 398 | card_type = license_data.get('type', '') | 483 | card_type = license_data.get('type', '') |
| 399 | is_ic = card_type.startswith('身份证') | 484 | is_ic = card_type.startswith('身份证') |
| 400 | is_info_side = card_type.endswith('信息面') | 485 | is_info_side = card_type.endswith('信息面') |
| ... | @@ -405,22 +490,40 @@ class Command(BaseCommand, LoggerMixin): | ... | @@ -405,22 +490,40 @@ class Command(BaseCommand, LoggerMixin): |
| 405 | field_map = consts.RP_MAP_0 if is_info_side else consts.RP_MAP_1 | 490 | field_map = consts.RP_MAP_0 if is_info_side else consts.RP_MAP_1 |
| 406 | for write_field, search_field in field_map: | 491 | for write_field, search_field in field_map: |
| 407 | id_card_dict[write_field] = license_data.get('words_result', {}).get(search_field, {}).get('words', '') | 492 | id_card_dict[write_field] = license_data.get('words_result', {}).get(search_field, {}).get('words', '') |
| 493 | location_list = license_data.get('words_result', {}).get(search_field, {}).get( | ||
| 494 | 'location', [-1, -1, -1, -1]) | ||
| 495 | if len(location_list) == 4: | ||
| 496 | position_dict[write_field] = { | ||
| 497 | consts.FIELD_POSITION_KEY: { | ||
| 498 | 'top': location_list[1], | ||
| 499 | 'left': location_list[0], | ||
| 500 | 'height': location_list[-1] - location_list[1], | ||
| 501 | 'width': location_list[2] - location_list[0] | ||
| 502 | } | ||
| 503 | } | ||
| 408 | if not is_info_side: | 504 | if not is_info_side: |
| 409 | start_time = license_data.get('words_result', {}).get('签发日期', {}).get('words', '') | 505 | start_time = license_data.get('words_result', {}).get('签发日期', {}).get('words', '') |
| 410 | end_time = license_data.get('words_result', {}).get('失效日期', {}).get('words', '') | 506 | end_time = license_data.get('words_result', {}).get('失效日期', {}).get('words', '') |
| 411 | id_card_dict['有效期限'] = '{0}-{1}'.format(start_time, end_time) | 507 | id_card_dict['有效期限'] = '{0}-{1}'.format(start_time, end_time) |
| 508 | end_time_location_list = license_data.get('words_result', {}).get('失效日期', {}).get( | ||
| 509 | 'location', [-1, -1, -1, -1]) | ||
| 510 | if len(end_time_location_list) == 4: | ||
| 511 | position_dict['有效期限'] = { | ||
| 512 | consts.FIELD_POSITION_KEY: { | ||
| 513 | 'top': end_time_location_list[1], | ||
| 514 | 'left': end_time_location_list[0], | ||
| 515 | 'height': end_time_location_list[-1] - end_time_location_list[1], | ||
| 516 | 'width': end_time_location_list[2] - end_time_location_list[0] | ||
| 517 | } | ||
| 518 | } | ||
| 412 | 519 | ||
| 413 | 520 | id_card_dict[consts.ALL_POSITION_KEY] = position_dict | |
| 521 | id_card_dict[consts.SECTION_IMG_PATH_KEY] = section_img_path | ||
| 414 | if not is_info_side: | 522 | if not is_info_side: |
| 415 | id_card_dict[consts.IMG_PATH_KEY_2] = img_path | 523 | id_card_dict[consts.IMG_PATH_KEY_2] = img_path |
| 416 | else: | 524 | else: |
| 417 | id_card_dict[consts.IMG_PATH_KEY] = img_path | 525 | id_card_dict[consts.IMG_PATH_KEY] = img_path |
| 418 | if is_ic: | 526 | if is_ic and is_save: |
| 419 | try: | ||
| 420 | base64_img = license_data.pop('base64_img') | ||
| 421 | except Exception as e: | ||
| 422 | pass | ||
| 423 | else: | ||
| 424 | card_type = -1 | 527 | card_type = -1 |
| 425 | json_data_4 = { | 528 | json_data_4 = { |
| 426 | 'mode': 1, | 529 | 'mode': 1, |
| ... | @@ -460,23 +563,33 @@ class Command(BaseCommand, LoggerMixin): | ... | @@ -460,23 +563,33 @@ class Command(BaseCommand, LoggerMixin): |
| 460 | '{0} [ocr_4 failed] [img_path={1}]'.format(self.log_base, img_path)) | 563 | '{0} [ocr_4 failed] [img_path={1}]'.format(self.log_base, img_path)) |
| 461 | 564 | ||
| 462 | id_card_dict[consts.IC_TURE_OR_FALSE] = consts.IC_RES_MAPPING.get(card_type) | 565 | id_card_dict[consts.IC_TURE_OR_FALSE] = consts.IC_RES_MAPPING.get(card_type) |
| 463 | finally: | 566 | |
| 464 | if do_dda and isinstance(id_card_dict.get(consts.IC_KEY_FIELD[0]), str) and isinstance(id_card_dict.get(consts.IC_KEY_FIELD[1]), str): | 567 | if do_dda and isinstance(id_card_dict.get(consts.IC_KEY_FIELD[0]), str) and \ |
| 465 | ic_name = id_card_dict[consts.IC_KEY_FIELD[0]].strip() | 568 | isinstance(id_card_dict.get(consts.IC_KEY_FIELD[1]), str): |
| 466 | ic_id = id_card_dict[consts.IC_KEY_FIELD[1]].strip() | 569 | ic_name = id_card_dict.get(consts.IC_KEY_FIELD[0], '').strip() |
| 570 | ic_id = id_card_dict.get(consts.IC_KEY_FIELD[1], '').strip() | ||
| 467 | if len(ic_name) > 0 and len(ic_id) > 0: | 571 | if len(ic_name) > 0 and len(ic_id) > 0: |
| 468 | dda_id_bc_mapping.setdefault(consts.IC_FIELD, []).append((ic_name, ic_id, img_path)) | 572 | dda_id_bc_mapping.setdefault(consts.IC_FIELD, []).append((ic_name, ic_id, img_path)) |
| 469 | license_summary.setdefault(classify, []).append(id_card_dict) | 573 | license_summary.setdefault(classify, []).append(id_card_dict) |
| 574 | # 购车发票 & 二手车发票 | ||
| 470 | elif classify == consts.MVI_CLASSIFY or classify == consts.UCI_CLASSIFY: | 575 | elif classify == consts.MVI_CLASSIFY or classify == consts.UCI_CLASSIFY: |
| 471 | rebuild_data_dict = {} | 576 | rebuild_data_dict = {} |
| 577 | position_dict = {} | ||
| 472 | mvi_res = license_data.pop('result', {}) | 578 | mvi_res = license_data.pop('result', {}) |
| 473 | for en_key, detail_dict in mvi_res.items(): | 579 | for en_key, detail_dict in mvi_res.items(): |
| 474 | rebuild_data_dict[detail_dict.get('chinese_key', '')] = detail_dict.get('words', '') | 580 | rebuild_data_dict[detail_dict.get('chinese_key', '')] = detail_dict.get('words', '') |
| 581 | position_dict[detail_dict.get('chinese_key', '')] = { | ||
| 582 | consts.FIELD_POSITION_KEY: detail_dict.get('position', {}) | ||
| 583 | } | ||
| 584 | rebuild_data_dict[consts.IMG_PATH_KEY] = img_path | ||
| 585 | rebuild_data_dict[consts.SECTION_IMG_PATH_KEY] = section_img_path | ||
| 586 | rebuild_data_dict[consts.ALL_POSITION_KEY] = position_dict | ||
| 475 | license_summary.setdefault(classify, []).append(rebuild_data_dict) | 587 | license_summary.setdefault(classify, []).append(rebuild_data_dict) |
| 476 | # 其他 | 588 | # 其他 |
| 477 | else: | 589 | else: |
| 478 | for res_dict in license_data: | 590 | for res_dict in license_data: |
| 479 | res_dict[consts.IMG_PATH_KEY] = img_path | 591 | res_dict[consts.IMG_PATH_KEY] = img_path |
| 592 | res_dict[consts.SECTION_IMG_PATH_KEY] = section_img_path | ||
| 480 | license_summary.setdefault(classify, []).extend(license_data) | 593 | license_summary.setdefault(classify, []).extend(license_data) |
| 481 | res_list.append((pno, ino, part_idx, consts.RES_SUCCESS)) | 594 | res_list.append((pno, ino, part_idx, consts.RES_SUCCESS)) |
| 482 | 595 | ... | ... |
-
Please register or sign in to post a comment