gpt4 book ai didi

python - 使用opencv在 Nose 和眼睛轴上旋转图像

转载 作者:太空宇宙 更新时间:2023-11-03 21:13:10 27 4
gpt4 key购买 nike

我有以下带有眼睛和噪声点的图像。图片中的人倾斜度很小,我想将其归一化。我用 dlib 标记了地标,所以我可以计算倾斜度。

现在,我怎样才能简单地旋转整个图像,那个家伙是直的? enter image description here

LEFT_EYE: [(274, 269), (286, 259), (302, 258), (317, 268), (302, 271), (286, 272)]
RIGHT_EYE : [(388, 264), (401, 254), (417, 252), (431, 261), (419, 265), (403, 265)]
NOSE: [(352, 257), (353, 278), (354, 297), (354, 319)]

作为一个想法,x 轴上的鼻尖点是 352、353、354、354。理论上,如果我进行矩阵变换,将所有 x 点更改为 352,噪声将呈直线。

我觉得可以用矩阵变换来完成,噪声或者眼点作为向量变换。但我需要一种方法,如何解决这个问题。

最佳答案

首先,对 Nose 点进行线性拟合,并使用斜率找到角度。为此,请切换 x 值和 y 值,使垂直向上的角度为 0 度(同时,当 Nose 几乎垂直开始时,您会获得更好的贴合度)。

# Nose points
nose = np.array([(352, 257), (353, 278), (354, 297), (354, 319)])

# Linear fit with x- and y-values switched
m,b = np.polyfit(nose[:,1], nose[:,0], 1)

# Angle in radians
angle = np.arctan(m)

接下来可以用opencv来get a rotation matrix .如果旋转中心无关紧要,您可以围绕图像的中心旋转。但在下方,我将它围绕 Nose 顶部旋转,这样如果您确实需要,这些点将沿着 x=352 线垂直放置。最后,使用旋转矩阵将图像旋转为cv2.warpAffine .

# Get rotation matrix
rot_mat = cv2.getRotationMatrix2D(tuple(nose[0]), -angle*180./np.pi, 1)

# Rotate image
dims = tuple(img.shape[:2][::-1])
rotated_image = cv2.warpAffine(img, rot_mat, dims)

这是生成的图像:

enter image description here

关于python - 使用opencv在 Nose 和眼睛轴上旋转图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53506404/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com