opencv 如何跟踪旋转图像后的像素位置?

1aaf6o9v  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(179)

我尝试随机旋转一些带有注解的图像,我尝试了解如何在旋转后获得新点位置,我的图像具有不同的形状
我尝试做的例子是:此函数用于根据此答案计算新位置(here

def new_pixel(x,y,theta,X,Y):
   sin = math.sin(theta)
   cos = math.cos(theta)
   x_new = (x-X/2)*cos + (y-X/2)*sin + X/2
   y_new = -(x-X/2)*sin + (y-Y/2)*cos + Y/2
   return int(x_new),int(y_new)

打开原始图像代码:

img = cv2.imread('D://ubun/1.jpg')
print(img.shape)
X, Y, c = img.shape
p1 = (124,291)
p2 = (168,291)
p3 = (169,391)
p4 = (125,391)
img1 = img.copy()
cv2.circle(img1, p1, 10, color=(255,0,0), thickness=2)
plt.imshow(img1)

红点就是

循环代码:

rotated = ndimage.rotate(img, 45)
print(rotated.shape)
p11 = new_pixel(p1[0],p1[1],45,X,Y)
p22 = new_pixel(p2[0],p2[1],45,X,Y)
p33 = new_pixel(p3[0],p3[1],45,X,Y)
p44 = new_pixel(p4[0],p4[1],45,X,Y)
cv2.circle(rotated, p11, 10, color=(255,0,0), thickness=2)
plt.imshow(rotated)

旋转后的图像和旋转后看到的点不在正确的位置:

我注意到旋转后图像形状不同,这是否会影响计算?

cbjzeqam

cbjzeqam1#

这个回复真的很晚了,但是即使是我也面临着同样的问题。所以基本上你的代码有两个问题。

  1. sin/cos以弧度作为输入,而不是度。所以只需将其转换为弧度就能得到正确的结果。
  2. X轴、Y轴:您正在获取未旋转的初始图像的高度和宽度。如果生成的图像与初始图像大小相同,则这是正确的,但由于生成的图像会调整输出大小以适应旋转后的完整图像,因此您需要获取X、Y作为新的宽度和高度。但是,只有在转换后添加新的高度和宽度时,才需要考虑新的高度和宽度。因此,公式为:
    x_new =(x-旧_宽度/2)*cos +(y-旧_高度/2)*sin +新_宽度/2
    y_new = -(x-旧_宽度/2)*sin +(y-旧_高度/2)*cos +新_高度/2
    我知道这篇文章太晚了,但希望这能帮助那些面临同样问题的人。

相关问题