PaddleOCR百度飞桨OCR识别古籍 作者:马育民 • 2025-07-08 09:27 • 阅读:10002 # 介绍 识别下图: [](https://www.malaoshi.top/upload/0/0/1GW1S4DJsm1p.png) # 代码 ``` from PIL import ImageFont from paddleocr import PaddleOCR import time img_path = "4.png" # 识别的图片 out_img_path = "./output/4.png" # 识别的文字框选出来 out_json_path = "./output/4_res_古籍.json" # 识别的文字信息 # 创建 OCR 实例 ocr = PaddleOCR( use_doc_orientation_classify=True, # 文档方向分类 # use_doc_unwarping=False, use_textline_orientation=True, # 启用行方向分类 text_detection_model_name="PP-OCRv5_mobile_det", text_recognition_model_name="PP-OCRv5_mobile_rec", # 古籍识别优化参数 text_det_box_thresh = 0.5, # 检测框阈值调低,提高漏检文字检出率 text_det_thresh = 0.3, # 二值化阈值调低,适应古籍纸张偏黄偏暗特性 ) print("加载模型完毕!") start_time = time.time() # 执行 OCR result = ocr.predict(img_path) end_time = time.time() elapsed_time = end_time - start_time print(f"predict执行耗时: {elapsed_time:.4f} 秒") print("result 数量:",len(result)) for res in result: # res.print() res.save_to_json(save_path = out_json_path) # 手动加载字体 try: font = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8") except IOError: font = ImageFont.truetype(r"C:\Windows\Fonts\simhei.ttf", 20, encoding="utf-8") # 自定义保存函数 def save_ocr_result_with_font(result, image_path, save_path, font): from PIL import Image, ImageDraw # import cv2 import numpy as np # 读取原始图像 # img = cv2.imread(image_path) # img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) img = Image.open(image_path) draw = ImageDraw.Draw(img) # 在图像上绘制识别结果 for line in result: texts = line["rec_texts"] boxes = line["dt_polys"] # print("box len::",len(boxes)) for i in range(len(boxes)): # box = np.array(box).astype(np.int32).reshape(-1, 2) text = texts[i] box = boxes[i] print(i,"-box:",box.tolist(),text) # 框选文字 draw.polygon(box.tolist(), outline=(255, 0, 0),width=2) # 绘制识别的顺序 draw.text(box[0], str(i), fill=(0, 255, 0)) # 保存图像 # img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR) # cv2.imwrite(save_path, img) # 保存图像 img.save(save_path) # 使用自定义函数保存结果 save_ocr_result_with_font(result, img_path, out_img_path , font) ``` # 执行结果 ### 框选的文字 [](https://www.malaoshi.top/upload/0/0/1GW1S4FLRIpx.png) ### 识别的文字 ``` "rec_texts": [ "夜詩集卷之一目錄", "自魁图後望雲邑西南諸山", "歳杪登雲和學暑魁閣", "壽天目桑少府", "諸菊盛開時齋之西新有大黄老本二株落", "齋中上座列大白药一盆一本数十垫具母指", "彭明府因玩盆菊有赠原童用一東中間錯見一", "聞居無賴寄典晚花承彭明府過赏奉酬原", "九月自孝登學署侍家大人對菊歌以誌喜", "看鸿", "琵琶", "以七律", "生自上年未開開且後而花奇腾因用前韻际", "真大靓也用見子璜", "大長身許枝業扶疎花勢團圈英英百泵", "一何多事因再次原韻成七律", "東冬送朱類同一音概然爲二二百六部之分", "之有天自然三百之最有本今加", "冬時俗名出想亦典到不及檢也竊怪詩" ], ``` # 问题 识别古籍文字的顺序不是从右往左,而是从上到下,再从左往右 ### 解决 根据x坐标,从新调整顺序,x坐标越大,越靠右,就说明是古籍第一行 ``` def process_guji(result): for line in result: texts = line["rec_texts"] boxes = line["dt_polys"] x_text_dict = {} # 定义dict,key是x坐标,value是识别的文字 for i in range(len(boxes)): text = texts[i] box = boxes[i] x = box[0][0].item() x_text_dict[ x ] = text for x in sorted(x_text_dict.keys(),reverse=True): print(x,x_text_dict[x]) process_guji(result) ``` 执行结果: ``` 480 琵琶 452 看鸿 419 九月自孝登學署侍家大人對菊歌以誌喜 391 聞居無賴寄典晚花承彭明府過赏奉酬原 365 彭明府因玩盆菊有赠原童用一東中間錯見一 344 冬時俗名出想亦典到不及檢也竊怪詩 316 之有天自然三百之最有本今加 292 東冬送朱類同一音概然爲二二百六部之分 267 一何多事因再次原韻成七律 234 夜詩集卷之一目錄 211 齋中上座列大白药一盆一本数十垫具母指 188 大長身許枝業扶疎花勢團圈英英百泵 164 真大靓也用見子璜 139 諸菊盛開時齋之西新有大黄老本二株落 110 生自上年未開開且後而花奇腾因用前韻际 87 以七律 59 壽天目桑少府 30 歳杪登雲和學暑魁閣 0 自魁图後望雲邑西南諸山 ``` 能够正确识别古籍顺序 原文出处:http://malaoshi.top/show_1GW1S4flu3Dr.html