如何实现任意角度超市账单图像自动旋转校正为正向水平
可行实现方案
方案1:Tesseract OCR 方向检测实现
这个方案适配带清晰文本的账单场景,调用Tesseract内置的朝向和脚本检测(OSD)功能,可以直接输出图像当前的旋转角度,支持识别0°、90°、180°、270°四个轴向,以及小于90°的倾斜角度,完全不需要手动输入角度。
- 操作步骤:
- 安装依赖:
pytesseract库和Tesseract本体程序,中文账单需要额外安装中文字符训练包 - 对输入图像做灰度化、二值化预处理,提升识别准确率
- 调用
pytesseract.image_to_osd()接口获取图像旋转角度 - 用OpenCV的旋转接口按照返回角度完成校正
- 安装依赖:
- 优势:不需要额外训练模型,对文本清晰的账单识别准确率高
方案2:传统CV轮廓检测实现
不需要依赖OCR模型,运行速度更快,适合轻量化部署场景。
- 操作步骤:
- 对图像做高斯模糊、Canny边缘检测预处理
- 提取图像所有轮廓,过滤出画面中最大的矩形轮廓(对应超市账单本体)
- 调用
cv2.minAreaRect()获取该矩形的旋转角度,计算需要补正的角度值 - 生成旋转矩阵对整张图像做仿射变换完成校正
- 优势:运行速度快,无外部模型依赖,适合拍摄背景干净、账单占画面比例较高的场景
方案3:轻量预训练OCR模型实现
推荐用PaddleOCR的预训练方向分类器,针对中文场景做了优化,准确率比通用Tesseract更高,开箱即用。
示例代码如下:
from paddleocr import PaddleOCR import cv2 # 仅初始化方向分类器,关闭不需要的检测、识别功能减少资源占用 ocr = PaddleOCR(use_angle_cls=True, lang='ch', show_log=False) # 读取待校正图像 img = cv2.imread("test_receipt.jpg") # 获取角度分类结果,返回值为(角度, 置信度) cls_res = ocr.ocr(img, det=False, rec=False, cls=True) target_angle = cls_res[0][0]["angle"] # 按角度完成旋转校正 if target_angle == 90: corrected_img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE) elif target_angle == 180: corrected_img = cv2.rotate(img, cv2.ROTATE_180) elif target_angle == 270: corrected_img = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE) else: # 处理小于90度的倾斜场景 h, w = img.shape[:2] M = cv2.getRotationMatrix2D((w/2, h/2), target_angle, 1.0) corrected_img = cv2.warpAffine(img, M, (w, h)) cv2.imwrite("corrected_receipt.jpg", corrected_img)
- 优势:中文识别准确率高,支持小角度倾斜校正,适配各种复杂拍摄场景
额外优化提示
如果拍摄的账单存在透视变形(比如斜着拍导致矩形变成梯形),可以在上述方案基础上增加透视变换步骤,拿到账单矩形的四个顶点后做透视校正,输出标准的正向矩形账单图像。
内容的提问来源于stack exchange,提问作者Tsk208
相关产品推荐
相关产品推荐

