点的旋转报错记录

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]]逆时针旋转

👉 因此,二者在图像坐标下的结果是 关于旋转中心对称的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值