如何在特定位置旋转图像的坐标(x,y)

2024-05-01 21:20:36 发布

您现在位置:Python中文网/ 问答频道 /正文

为了更好地理解,请在Jupyternotebook中复制代码:

我有两个文件:图片.jpg以及img.txt文件. 图片.jpg是图像和img.txt文件是面部地标…如果你同时绘制它们,它会像这样:

enter image description here

我把图像旋转了24.5度…但是我怎么旋转坐标呢?你知道吗

enter image description here

import cv2
img = cv2.imread('img.jpg')
plt.imshow(img)
plt.show()


# In[130]:


landmarks = []
with open('img.txt') as f:
    for line in f:
        landmarks.extend([float(number) for number in line.split()])
landmarks.pop(0) #Remove first line. 
#Store all points inside the variable. 
landmarkPoints = [] #Store the points in this
for j in range(int(len(landmarks))):
    if j%2 == 1:
        continue
    landmarkPoints.append([int(landmarks[j]),int(landmarks[j+1])])


# In[ ]:

def rotate_bound(image, angle):
# grab the dimensions of the image and then determine the
# center
(h, w) = image.shape[:2]
(cX, cY) = (w // 2, h // 2)

# grab the rotation matrix (applying the negative of the
# angle to rotate clockwise), then grab the sine and cosine
# (i.e., the rotation components of the matrix)
M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)
cos = np.abs(M[0, 0])
sin = np.abs(M[0, 1])

# compute the new bounding dimensions of the image
nW = int((h * sin) + (w * cos))
nH = int((h * cos) + (w * sin))

# adjust the rotation matrix to take into account translation
M[0, 2] += (nW / 2) - cX
M[1, 2] += (nH / 2) - cY

# perform the actual rotation and return the image
return cv2.warpAffine(image, M, (nW, nH)) 



# In[131]:


imgcopy = img.copy()
for i in range(len(landmarkPoints)):
    cv2.circle(imgcopy, (landmarkPoints[i][0], landmarkPoints[i][1]), 5, (0, 255, 0), -1)
plt.imshow(imgcopy)
plt.show()
landmarkPoints


# In[146]:


print(img.shape)
print(rotatedImage.shape)


# In[153]:


face_angle = 24.5
rotatedImage = rotate_bound(img, -face_angle)
for i in range(len(landmarkPoints)):
    x,y = (landmarkPoints[i][0], landmarkPoints[i][1])
    cv2.circle(rotatedImage, (int(x),int(y)), 5, (0, 255, 0), -1)
plt.imshow(rotatedImage)
plt.show()

请下载图片.jpg以及img.txt文件为了重现这个:https://drive.google.com/file/d/1FhQUFvoKi3t7TrIepx2Es0mBGAfT755w/view?usp=sharing

我试过这个函数,但是y轴错了

def rotatePoint(angle, pt):
    a = np.radians(angle)
    cosa = np.cos(a)
    sina = np.sin(a)
    return pt[0]*cosa - pt[1]*sina, pt[0] * sina + pt[1] * cosa

编辑:上面的函数给我这个结果:

enter image description here


Tags: 文件theinimageptimgfornp
1条回答
网友
1楼 · 发布于 2024-05-01 21:20:36

当你尝试这样的事情时,选择合适的坐标系是非常重要的。在您的例子中,您必须将原点(0,0)放在图像的中心。你知道吗

将旋转应用于原点位于中心的坐标后,面点将在新图像上正确对齐。你知道吗

相关问题 更多 >