一起养成写作习惯!这是我参与「日新计划 4 月更文挑战」的第27天,点击查看活动详情。

1.PaddleOCR课表图片一键转电子版由来

最近看到一个手机应用,突然一个想法蹦了出来,客官请看下图

PaddleOCR课表图片一键转电子版

那,这是小米手机android的drawable类android是什么系统带的小爱课程表,其中有一项就是拍照课http代理表导入。然而我试用了好几次,每次导入都显示空白,可能服务在测试git教程中吧。有小米手机的同学可以测试下,如果结果不一样可以告诉我下。于是我就想自己写个小东西试试。

2.问题来了

2.1 小朋友的课表

幼儿园小朋友的课表长这样:

PaddleOCR课表图片一键转电子版

这种表格很常见,一行一个,我们可以利用PaddleOCR表格识别3行搞定。具体参看:《httpwatch动手学OCR》系列课程之:文档分析实战-表格识别

2.1 大朋友的课表

我们大朋友的课表一般长这样:

PaddleOCR课表图片一键转电子版

对这种一个像素单元格多行的就需要好多代码,好费劲,这次就先换elementary是什么意思个思路做。

3.解决思路

我的解决思路就是问题转换,具体步骤如下:

  • 切分表格单元格子
  • 每个单元http 404http代理文字识别

那就开干

4.切分单元格

4.1 引入必要的库

# clone PaddleOCR代码
! git  clone https://gitee.com/PaddlePaddle/PaddleOCR --depth=1
Cloning into 'PaddleOCR'...
remote: Enumerating objects: 1237, done.[K
remote: Counting objects: 100% (1237/1237), done.[K
remote: Compressing objects: 100% (1108/1108), done.[K
remote: Total 1237 (delta 204), reused 699 (delta 79), pack-reused 0[K
Receiving objects: 100% (1237/1237), 101.41 MiB | 7.16 MiB/s, done.
Resolving deltas: 100% (204/204), done.
Checking connectivity... done.
%cd ~
!pip install -U pip --user >log.log
!pip install -r PaddleOCR/requirements.txt  >log.log
!pip install shapely >log.log
!pip install -e PaddleOCR >log.log
/home/aistudio
%cd ~/PaddleOCR/
import cv2
import numpy as np
from paddleocr import PaddleOCR
import openpyxl
/home/aistudio/PaddleOCR

4.2 切分表格

其中代码中的

cv2.imshow("二值化图片:", binary)  # 展示图片
cv2.waitKey(0)

可以去掉注释,本地查看查看表格分割过程

def seg_pic(img):
    image = cv2.imread(img, 1)
    # 灰度图片
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # 二值化
    binary = cv2.adaptiveThreshold(~gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 35, -5)
    # ret,binary = cv2.threshold(~gray, 127, 255, cv2.THRESH_BINARY)
    # cv2.imshow("二值化图片:", binary)  # 展示图片
    # cv2.waitKey(0)
    rows, cols = binary.shape
    scale = 40
    # 识别横线
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (cols // scale, 1))
    eroded = cv2.erode(binary, kernel, iterations=1)
    # cv2.imshow("Eroded Image",eroded)
    dilatedcol = cv2.dilate(eroded, kernel, iterations=1)
    # cv2.imshow("表格横线展示:", dilatedcol)
    # cv2.waitKey(0)
    # 识别竖线
    scale = 20
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, rows // scale))
    eroded = cv2.erode(binary, kernel, iterations=1)
    dilatedrow = cv2.dilate(eroded, kernel, iterations=1)
    # cv2.imshow("表格竖线展示:", dilatedrow)
    # cv2.waitKey(0)
    # 标识交点
    bitwiseAnd = cv2.bitwise_and(dilatedcol, dilatedrow)
    # cv2.imshow("表格交点展示:", bitwiseAnd)
    # cv2.waitKey(0)
    # cv2.imwrite("my.png",bitwiseAnd) #将二值像素点生成图片保存
    # 标识表格
    merge = cv2.add(dilatedcol, dilatedrow)
    # cv2.imshow("表格整体展示:", merge)
    # cv2.waitKey(0)
    # 两张图片进行减法运算,去掉表格框线
    merge2 = cv2.subtract(binary, merge)
    # cv2.imshow("图片去掉表格框线展示:", merge2)
    # cv2.waitKey(0)
    # 识别黑白图中的白色交叉点,将横纵坐标取出
    ys, xs = np.where(bitwiseAnd > 0)
    mylisty = []  # 纵坐标
    mylistx = []  # 横坐标
    # 通过排序,获取跳变的x和y的值,说明是交点,否则交点会有好多像素值值相近,我只取相近值的最后一点
    # 这个10的跳变不是固定的,根据不同的图片会有微调,基本上为单元格表格的高度(y坐标跳变)和长度(x坐标跳变)
    i = 0
    myxs = np.sort(xs)
    for i in range(len(myxs) - 1):
        if (myxs[i + 1] - myxs[i] > 10):
            mylistx.append(myxs[i])
        i = i + 1
    mylistx.append(myxs[i])  # 要将最后一个点加入
    i = 0
    myys = np.sort(ys)
    # print(np.sort(ys))
    for i in range(len(myys) - 1):
        if (myys[i + 1] - myys[i] > 10):
            mylisty.append(myys[i])
        i = i + 1
    mylisty.append(myys[i])  # 要将最后一个点加入
    return image, mylistx, mylisty

5.调用PaddleOCR进行识别

def course_ocr(image, mylistx, mylisty):
    ocr = PaddleOCR(det=True)
    # 循环y坐标,x坐标分割表格
    mylist = []
    for i in range(len(mylisty) - 1):
        row = []
        for j in range(len(mylistx) - 1):
            # 在分割时,第一个参数为y坐标,第二个参数为x坐标
            ROI = image[mylisty[i] + 3:mylisty[i + 1] - 3, mylistx[j]:mylistx[j + 1] - 3]  # 减去3的原因是由于我缩小ROI范围
            # cv2.imshow("分割后子图片展示:", ROI)
            # cv2.waitKey(0)
            result = ocr.ocr(ROI, det=True)
            text_len = len(result)
            tmptxt = ' '
            txt = ' '
            if text_len != 0:
                for line in result:
                    tmptxt, _ = line[-1]
                    txt = txt + 'n' + tmptxt
            row.append(txt)
            j = j + 1
        i = i + 1
        mylist.append(row)
    return mylist

6.保存识别结果到eelementary翻译xcel

以大朋友课表为例。

def writeToExcel(file_path, new_list):
    wb = openpyxl.Workbook()
    ws = wb.active
    ws.title = '我的课程表'
    for r in range(len(new_list)):
        for c in range(len(new_list[0])):
            ws.cell(r + 1, c + 1).value = new_list[r][c]
            ws.cell(r + 1, c + 1).alignment = openpyxl.styles.Alignment(wrapText=True)
            # excel中的行和列是从1开始计数的,所以需要+1
    wb.save(file_path)  # 注意,写入后一定要保存
    print("成功写入文件: " + file_path + " !")
    return 1
if __name__ == '__main__':
    img = '../1.jpg'
    image, mylistx, mylisty = seg_pic(img)
    mylist = course_ocr(image, mylistx, mylisty)
    writeToExcel('../mycourse.xls', mylist)
[2022/04/27 01:34:43] root WARNING: version PP-OCRv2 not support cls models, auto switch to version PP-OCR
Namespace(benchmark=False, cls_batch_num=6, cls_image_shape='3, 48, 192', cls_model_dir='/home/aistudio/.paddleocr/2.4/ocr/cls/ch_ppocr_mobile_v2.0_cls_infer', cls_thresh=0.9, cpu_threads=10, crop_res_save_dir='./output', det=True, det_algorithm='DB', det_db_box_thresh=0.6, det_db_score_mode='fast', det_db_thresh=0.3, det_db_unclip_ratio=1.5, det_east_cover_thresh=0.1, det_east_nms_thresh=0.2, det_east_score_thresh=0.8, det_limit_side_len=960, det_limit_type='max', det_model_dir='/home/aistudio/.paddleocr/2.4/ocr/det/ch/ch_PP-OCRv2_det_infer', det_pse_box_thresh=0.85, det_pse_box_type='box', det_pse_min_area=16, det_pse_scale=1, det_pse_thresh=0, det_sast_nms_thresh=0.2, det_sast_polygon=False, det_sast_score_thresh=0.5, draw_img_save_dir='./inference_results', drop_score=0.5, e2e_algorithm='PGNet', e2e_char_dict_path='./ppocr/utils/ic15_dict.txt', e2e_limit_side_len=768, e2e_limit_type='max', e2e_model_dir=None, e2e_pgnet_mode='fast', e2e_pgnet_score_thresh=0.5, e2e_pgnet_valid_set='totaltext', enable_mkldnn=False, gpu_mem=500, help='==SUPPRESS==', image_dir=None, ir_optim=True, is_visualize=True, label_list=['0', '180'], label_map_path='./vqa/labels/labels_ser.txt', lang='ch', layout_path_model='lp://PubLayNet/ppyolov2_r50vd_dcn_365e_publaynet/config', max_batch_size=10, max_seq_length=512, max_text_length=25, min_subgraph_size=15, mode='structure', model_name_or_path=None, ocr_version='PP-OCRv2', output='./output', precision='fp32', process_id=0, rec=True, rec_algorithm='CRNN', rec_batch_num=6, rec_char_dict_path='/home/aistudio/PaddleOCR/ppocr/utils/ppocr_keys_v1.txt', rec_image_shape='3, 32, 320', rec_model_dir='/home/aistudio/.paddleocr/2.4/ocr/rec/ch/ch_PP-OCRv2_rec_infer', save_crop_res=False, save_log_path='./log_output/', show_log=True, structure_version='STRUCTURE', table_char_dict_path=None, table_char_type='en', table_max_len=488, table_model_dir=None, total_process_num=1, type='ocr', use_angle_cls=False, use_dilation=False, use_gpu=True, use_mp=False, use_onnx=False, use_pdserving=False, use_space_char=True, use_tensorrt=False, use_xpu=False, vis_font_path='./doc/fonts/simfang.ttf', warmup=False)
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 0, elapse : 0.006531238555908203
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 0, elapse : 2.384185791015625e-06
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 1, elapse : 0.0051233768463134766
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 1, elapse : 0.005103349685668945
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 1, elapse : 0.004321575164794922
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 1, elapse : 0.003765106201171875
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 1, elapse : 0.0042073726654052734
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 1, elapse : 0.003260374069213867
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 1, elapse : 0.0038406848907470703
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 1, elapse : 0.003651142120361328
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 1, elapse : 0.0042264461517333984
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 1, elapse : 0.003298044204711914
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 1, elapse : 0.004177093505859375
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 1, elapse : 0.0032699108123779297
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 1, elapse : 0.0044329166412353516
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 1, elapse : 0.004613399505615234
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 4, elapse : 0.007636070251464844
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 4, elapse : 0.016942501068115234
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 4, elapse : 0.007181644439697266
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 4, elapse : 0.028723478317260742
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 4, elapse : 0.006295680999755859
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 4, elapse : 0.010427713394165039
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 4, elapse : 0.005945444107055664
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 4, elapse : 0.01737380027770996
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 4, elapse : 0.006776094436645508
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 4, elapse : 0.00892782211303711
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 3, elapse : 0.005718231201171875
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 3, elapse : 0.009186744689941406
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 1, elapse : 0.012636423110961914
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 1, elapse : 0.0038542747497558594
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 4, elapse : 0.0060460567474365234
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 4, elapse : 0.010711431503295898
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 4, elapse : 0.005934715270996094
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 4, elapse : 0.010719776153564453
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 4, elapse : 0.006722927093505859
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 4, elapse : 0.008838653564453125
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 4, elapse : 0.006777286529541016
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 4, elapse : 0.010182619094848633
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 4, elapse : 0.0057184696197509766
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 4, elapse : 0.009193658828735352
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 3, elapse : 0.005079507827758789
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 3, elapse : 0.010016202926635742
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 1, elapse : 0.005192756652832031
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 1, elapse : 0.0044367313385009766
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 3, elapse : 0.006910085678100586
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 3, elapse : 0.013296365737915039
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 5, elapse : 0.007179975509643555
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 5, elapse : 0.020600318908691406
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 3, elapse : 0.00620579719543457
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 3, elapse : 0.011708974838256836
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 5, elapse : 0.006657600402832031
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 5, elapse : 0.017567873001098633
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 0, elapse : 0.004624843597412109
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 0, elapse : 2.86102294921875e-06
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 3, elapse : 0.006276130676269531
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 3, elapse : 0.010603904724121094
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 1, elapse : 0.004540681838989258
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 1, elapse : 0.003960609436035156
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 3, elapse : 0.017763137817382812
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 3, elapse : 0.012119531631469727
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 3, elapse : 0.005829572677612305
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 3, elapse : 0.01071023941040039
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 3, elapse : 0.0066606998443603516
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 3, elapse : 0.012371301651000977
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 3, elapse : 0.006064891815185547
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 3, elapse : 0.011263370513916016
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 0, elapse : 0.003898143768310547
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 0, elapse : 1.9073486328125e-06
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 3, elapse : 0.017630577087402344
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 3, elapse : 0.009505271911621094
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 1, elapse : 0.0038466453552246094
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 1, elapse : 0.003913402557373047
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 4, elapse : 0.005899190902709961
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 4, elapse : 0.014079093933105469
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 3, elapse : 0.006704092025756836
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 3, elapse : 0.012315750122070312
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 3, elapse : 0.006354570388793945
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 3, elapse : 0.011947393417358398
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 3, elapse : 0.0055255889892578125
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 3, elapse : 0.011304855346679688
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 0, elapse : 0.0035974979400634766
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 0, elapse : 1.6689300537109375e-06
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 0, elapse : 0.003297567367553711
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 0, elapse : 1.9073486328125e-06
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 1, elapse : 0.003625631332397461
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 1, elapse : 0.004254579544067383
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 4, elapse : 0.00618743896484375
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 4, elapse : 0.01336669921875
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 3, elapse : 0.0070950984954833984
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 3, elapse : 0.012484073638916016
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 3, elapse : 0.008647918701171875
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 3, elapse : 0.012476682662963867
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 3, elapse : 0.0059299468994140625
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 3, elapse : 0.012735843658447266
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 0, elapse : 0.004593372344970703
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 0, elapse : 2.86102294921875e-06
[2022/04/27 01:34:44] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be used during the forward process
[2022/04/27 01:34:44] root DEBUG: dt_boxes num : 0, elapse : 0.004207611083984375
[2022/04/27 01:34:44] root DEBUG: rec_res num  : 0, elapse : 3.337860107421875e-06
成功写入文件: ../mycourse.xls !

下载并excel打开长这样:

PaddleOCR课表图片一键转电子版

细看,和目标照片区别不大。

7.下部工作

  • 下一步,可以加入自动识别表格方向,并利用小程序、android app来部署,提供更好的体验。
  • 完整的httpclient代码已放目录下了。
  • 大家可以试像素射击下载试自己的课表,看识别效果如何?
  • 欢迎提各种好建议、好思路、好点子,晚安!!!

PaddleOCR课表图片一键转电子版