如何通过PaddleOCR获取文本区域旋转角度以校正裁剪方向?
获取PaddleOCR旋转文本的角度信息以正确裁剪区域
开启use_angle_cls=True模式时,PaddleOCR可正确识别90°、180°甚至270°旋转的文本,但默认返回结果未包含旋转角度信息,导致依据返回坐标裁剪出的文本区域方向通常不正确(如原始图片中的旋转文本,裁剪后呈现方向错误的状态)。以下是两种获取旋转角度并得到正确方向裁剪区域的方法:
方法一:从PaddleOCR推理结果中直接提取角度分类值
PaddleOCR的角度分类模块实际会输出文本的旋转角度类别,只是默认返回的结果结构未包含该信息。你可以通过修改推理代码,在输出中加入角度分类结果:
- 找到PaddleOCR推理流程中调用角度分类器的部分(通常在
paddleocr.py或相关推理脚本里); - 获取
angle_cls模型的输出值(不同版本的映射关系略有差异,一般0对应0°、1对应180°,部分模型会细分90°/270°的类别); - 将角度值与文本识别结果、坐标信息一起返回。
方法二:通过文本框坐标计算旋转角度
如果不想修改源码,可以利用返回的文本框四点坐标计算旋转角度:
计算角度的代码示例
import math def get_text_rotation_angle(points): # points为文本框的四点坐标,格式:[[x1,y1], [x2,y2], [x3,y3], [x4,y4]] # 取左上角和右上角的坐标计算水平夹角 dx = points[1][0] - points[0][0] dy = points[1][1] - points[0][1] # 计算弧度并转换为角度 angle = math.degrees(math.atan2(dy, dx)) # 调整角度到0-360°范围 if angle < 0: angle += 360 return angle
裁剪后修正图像方向
得到角度后,使用OpenCV或PIL对裁剪后的图像进行旋转修正:
import cv2 import numpy as np def correct_image_orientation(image, angle): # 获取图像尺寸与中心 h, w = image.shape[:2] center = (w // 2, h // 2) # 生成旋转矩阵 rotation_matrix = cv2.getRotationMatrix2D(center, -angle, 1.0) # 计算旋转后的图像尺寸,避免内容被裁剪 cos_val = np.abs(rotation_matrix[0, 0]) sin_val = np.abs(rotation_matrix[0, 1]) new_width = int((h * sin_val) + (w * cos_val)) new_height = int((h * cos_val) + (w * sin_val)) # 调整旋转矩阵的平移参数,保证图像居中 rotation_matrix[0, 2] += (new_width / 2) - center[0] rotation_matrix[1, 2] += (new_height / 2) - center[1] # 执行旋转,用白色填充空白区域 corrected_image = cv2.warpAffine(image, rotation_matrix, (new_width, new_height), borderValue=(255, 255, 255)) return corrected_image
内容的提问来源于stack exchange,提问作者user176953
相关产品推荐
相关产品推荐

