点的旋转报错记录
import cv2, numpy as np
pts = np.array([[100, 100], [200, 100], [200, 200]], np.float32)
center = np.array([150, 150], np.float32)
angle = 45
# 方法 1: 你自己的函数
def rotate_around_center(points, center, angle_deg):
angle_rad = np.deg2rad(angle_deg)
R = np.array([
[np.cos(angle_rad), -np.sin(angle_rad)],
[np.sin(angle_rad),  np.cos(angle_rad)]
])
return (points - center) @ R.T + center
r1 = rotate_around_center(pts, center, angle)
# 方法 2: OpenCV 仿射矩阵
M = cv2.getRotationMatrix2D(tuple(center), angle, 1.0)
r2 = cv2.transform(pts.reshape(-1, 1, 2), M).reshape(-1, 2)
print(np.allclose(r1, r2))
rotate_around_center() 和 cv2.getRotationMatrix2D() + cv2.transform() 的结果确实可能不同,
虽然理论上看似等价。
这种差异不是数值误差,而是 OpenCV 的旋转矩阵定义方式与我们数学推导中的符号方向不同。
我来带你一步步看出根源 👇
🧩 一、根本原因:角度方向(符号)不同
在 OpenCV 中:
cv2.getRotationMatrix2D(center, angle, scale)
定义的angle是 逆时针为正方向,但图像坐标系的 y 轴是向下的。
而在标准数学坐标系中(你手写的版本):
y 轴向上。
所以:
在 图像坐标系 下,y 轴朝下;
OpenCV 在内部等价于执行了一个 顺时针旋转;
而你的矩阵
R = [[cos, -sin], [sin, cos]]是逆时针旋转。
👉 因此,二者在图像坐标下的结果是 关于旋转中心对称的。
