假设对图片上任意点(x,y),绕一个坐标点(rx0,ry0)逆时针旋转a角度后的新的坐标设为(x0, y0),有公式:
x0 = (x-rx0)*cos(a) - (y-ry0)*sin(a) + rx0;
y0 = (x-rx0)*sin(a) + (y-ry0)*cos(a) + ry0;
测试逻辑:
设置大小为512*512的画布,绿色点(100, 100)沿着红色中心点(200, 300)顺时针旋转30度。旋转结果为黄色点。
import cv2
import math
import numpy as np
def test():
img = np.ones((512, 512, 3), dtype=np.uint8) * 255 # h,w,c
center = (200, 300) # x, y
rx0, ry0 = center
cv2.circle(img, (rx0, ry0), 5, (0, 0, 255), thickness=10)
x, y = (100, 100)
angle = math.radians(30) # 角度转弧度
cv2.circle(img, (x, y), 5, (0, 255, 0), thickness=10)
cv2.line(img, center, (x, y), (0, 0, 0), thickness=2)
x0 = int((x - rx0) * math.cos(angle) - (y - ry0) * math.sin(angle) + rx0)
y0 = int((x - rx0) * math.sin(angle) + (y - ry0) * math.cos(angle) + ry0)
cv2.circle(img, (x0, y0), 5, (0, 255, 255), thickness=10)
cv2.line(img, center, (x0, y0), (0, 0, 0), thickness=2)
cv2.imwrite("ret.jpg", img)
结果:
推理过程:https://jingyan.baidu.com/article/2c8c281dfbf3dd0009252a7b.html