Просмотр исходного кода

修正图像旋转算法,优化旋转矩阵实现,新增坐标旋转说明文档

zhch158_admin 2 месяцев назад
Родитель
Сommit
83ad36b24d
2 измененных файлов с 35 добавлено и 6 удалено
  1. 6 6
      ocr_validator_utils.py
  2. 29 0
      图片操作说明.md

+ 6 - 6
ocr_validator_utils.py

@@ -166,7 +166,7 @@ def rotate_image_and_coordinates(
             new_x2 = orig_width - x1
             new_y2 = orig_height - y1
             
-        else:  # 任意角度算法,目前90,-90不对
+        else:  # 任意角度算法 - 修正版本
             # 将角度转换为弧度
             angle_rad = np.radians(rotation_angle)
             cos_angle = np.cos(angle_rad)
@@ -188,13 +188,13 @@ def rotate_image_and_coordinates(
                 (x1 - orig_center_x, y2 - orig_center_y)   # 左下角
             ]
             
-            # 应用旋转矩阵变换每个角点
+            # 应用修正后的旋转矩阵变换每个角点
             rotated_corners = []
             for x, y in corners:
-                # 旋转矩阵: [cos(θ) -sin(θ)] [x]
-                #          [sin(θ)  cos(θ)] [y]
-                rotated_x = x * cos_angle - y * sin_angle
-                rotated_y = x * sin_angle + y * cos_angle
+                # 修正后的旋转矩阵: [cos(θ)  sin(θ)] [x]
+                #                  [-sin(θ) cos(θ)] [y]
+                rotated_x = x * cos_angle + y * sin_angle
+                rotated_y = -x * sin_angle + y * cos_angle
                 
                 # 转换回绝对坐标(相对于新图像)
                 abs_x = rotated_x + new_center_x

+ 29 - 0
图片操作说明.md

@@ -230,3 +230,32 @@ def create_resized_interactive_plot(self, image: Image.Image, selected_bbox: Opt
 - `y=image.height` 表示图像在Plotly坐标系中的顶部位置
 - 所有bbox坐标都需要进行Y轴翻转:`plotly_y = image_height - json_y`
 - 这样才能确保图像和标注框正确对齐
+
+# ocr json结果坐标旋转说明
+在坐标系中,原点位于左上角,x轴向右增加,y轴向下增加(类似于屏幕坐标系)。绕原点旋转任意角度θ(θ为用户视角的逆时针角度)的旋转矩阵为:
+
+```math
+\begin{bmatrix}
+x' \\
+y'
+\end{bmatrix}
+=
+\begin{bmatrix}
+\cos \theta & \sin \theta \\
+-\sin \theta & \cos \theta
+\end{bmatrix}
+\begin{bmatrix}
+x \\
+y
+\end{bmatrix}
+```
+
+其中:
+- \((x, y)\) 是旋转前的坐标,
+- \((x', y')\) 是旋转后的坐标,
+- \(\theta\) 是旋转角度(以弧度表示),用户视角的逆时针方向为正。
+
+### 说明:
+- 这个矩阵实现了从用户视角看到的逆时针旋转。例如,当θ = 90°(π/2弧度)时,点(1, 0)会旋转到(0, -1),即指向屏幕上方(y负方向)。
+- 如果使用角度制,确保在计算前将角度转换为弧度(因为三角函数通常使用弧度)。
+- 该矩阵适用于任何旋转角度θ。