## 🔄 **旋转角度的约定差异** ### **1. 图像处理中的旋转约定(OpenCV/PIL)** 在大多数图像处理库中: - **逆时针旋转** = **正角度** - **顺时针旋转** = **负角度** ```python # OpenCV/PIL 的旋转约定 cv2.rotate(image, cv2.ROTATE_90_COUNTERCLOCKWISE) # 逆时针90° = +90° cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE) # 顺时针90° = -90° = 270° ``` ### **2. 方向分类模型的输出约定** 在 MinerU 的方向分类模型中,输出的旋转角度表示的是**需要旋转多少度来恢复正常方向**,具体含义如下: - `0°` → 图片已经是正常方向,无需旋转 ocr_tools/universal_doc_parser/models/adapters/mineru_adapter.py 但是,**MinerU 的方向分类模型** 返回的是: ```python 0° → 正常方向 90° → 需要顺时针旋转90°才能恢复(图片当前是逆时针旋转了90°) 180° → 需要旋转180°才能恢复(倒置) 270° → 需要顺时针旋转270°才能恢复(图片当前是顺时针旋转了90°) ``` **关键理解**:模型返回的是"需要旋转多少度来恢复正常",而不是"图片当前旋转了多少度"。 rotated_table, table_angle = self.preprocessor.process(cropped_table)会返回**恢复正常方向的图片和角度值** --- ### 2. pdf_coordinate_transform.py (~250行) **作用**: PDF坐标系与图像坐标系的转换 **核心函数**: - `pdf_rotation_to_image_rotation()`: **PDF旋转角度转换为图片旋转角度** - `transform_bbox_for_rotation_fitz()`: fitz引擎的完整几何坐标变换 - `transform_bbox_for_rotation_pypdfium2()`: pypdfium2引擎的坐标值交换 **坐标系说明**: - **PDF坐标系**: 左下角原点 (0,0),X向右,Y向上 - **图像坐标系**: 左上角原点 (0,0),X向右,Y向下 **旋转定义(重要)**: - **PDF rotation**: 0/90/180/270度(**顺时针旋转**,PDF规范) - **图片rotation**: 0/90/180/270度(**逆时针旋转**,图像处理标准) - **对外API统一返回图片rotation**(逆时针定义) **旋转转换映射**: | PDF Rotation (顺时针) | 图片 Rotation (逆时针) | |---------------------|---------------------| | 0° | 0° | | 90° | 270° | | 180° | 180° | | 270° | 90° | **关键区别**: | 特性 | fitz | pypdfium2 | |------|------|-----------| | 输入坐标系 | PDF原始坐标系 | 已旋转的坐标系(但bbox顺序错误) | | 变换类型 | 几何空间变换 | 坐标值交换(修正min/max) | | 复杂度 | 高(涉及旋转公式) | 低(只是交换) |