|
|
@@ -0,0 +1,63 @@
|
|
|
+## 🔄 **旋转角度的约定差异**
|
|
|
+
|
|
|
+### **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) |
|
|
|
+| 复杂度 | 高(涉及旋转公式) | 低(只是交换) |
|