本文的内容可以看结构图,结果和推导过程都有 ps:文章内容是自己写的,但是在Typora上用LaTex编辑好的公式没法在这里用,重新编辑成本太高,就很尴尬,只好用Typora把全文输出为图像,直接发了,可复制的代码部分和超链接会在最后给出
代码段:
import numpy as np
import os
def gen_rot_mtx(angle,isdegree):
if isdegree:
angle = math.radians(angle)
cos_rad = math.cos(angle)
sin_rad = math.sin(angle)
trans = np.eye(3)
trans[:2, :2] = [[cos_rad, -sin_rad], [sin_rad, cos_rad]]
return trans
def rot_around_point(rot_mtx,value,point):
'''
批量N个点的旋转
:param rot_mtx: 旋转矩阵的内容
:param value: 要旋转的点,是shape为(N,2)的矩阵,两列分别为XY坐标或者UV坐标
:param center_point: 旋转的中心点,是(1,2)的矩阵,分别为XY坐标或者UV坐标
:param height: 图像的高
:return:旋转之后的点的坐标,shape仍为(N,2)
'''
trans_mtx_3 = np.eye(3)
trans_mtx_1 = np.eye(3)
trans_mtx_3[:2,2] = point
trans_mtx_1[:2,2] = -point
trans = trans_mtx_3 @ rot_mtx33 @ trans_mtx_1
value_ones = np.ones((len(value), 1))
value = np.hstack((value, value_ones))
value_after_rot = (trans @ value.T).T
value_after_rot = value_after_rot[:,:2]
return value_after_rot
if __name__ = "__main__":
dirname = "./tools"
hole_value = np.load(os.path.join(dirname,'curr_hole_mask.npy'))
rot_mtx = gen_rot_mtx(60,True)
value_after_rot = rot_around_point(rot_mtx,hole_value,[50,100])
OpenCV旋转
用于旋转整张图片,得到的结果是旋转之后的图片
注意:OpenCV中的坐标是
(
v
,
u
)
(v,u)
(v,u),而非本文UV坐标系中的
(
u
,
v
)
(u,v)
(u,v),所以在旋转正方向上是相反的,把gen_rot_mtx生成的逆时针旋转
θ
\theta
θ的旋转矩阵,输入cv2.warpAffine中,得到的旋转结果会变成顺时针旋转
θ
\theta
θ
函数的具体用法和一些推导可以见Fang Suk的文章python-opencv 图像平移旋转变换、以及图像旋转前后坐标值映射关系
|