python - 如何围绕图像中心旋转多个矩形坐标
问题描述
在测试计算机视觉算法对象检测时,通过旋转测试图像可以检测到一些遗漏的对象。通过这样做,矩形中每个点的 (x,y) 坐标表示的那些检测到的对象位置应该向后旋转。对象检测器的输出是一个 Numpy 数组,它包含例如 100 个元素,每个元素具有 4 个对点,表示检测到的对象周围矩形的 (x,y) 坐标,即具有 (100,8) 形状的 Numpy 数组。这些对象是在原始图像的旋转版本中检测到的。因此,必须将它们旋转回来才能在原始图像上进行可视化。原始图像的分辨率为 5616x3744px,因此旋转 90 度的版本为 3744x5616px。
- 每一行就像 [x1,y1,x2,y2,x3,y3,x4,y4]
问题是我们如何将所有这些点围绕图像中心旋转成一条线,我们认为是(2808,1872)。当我运行以下代码时,Python 会抛出一个ValueError: operands could not be broadcast together with shapes (1000,8) (2,)
有意义的错误。在这种情况下,速度很重要。所以我试图避免使用for
循环。
def Rotate2D(pts,cnt,degree):
ang = math.radians(degree)
'''pts = {} Rotates points(nx2) about center cnt(2) by angle ang(1) in radian'''
return scipy.dot(pts-cnt,scipy.array([[scipy.cos(ang),scipy.sin(ang)],[-scipy.sin(ang),scipy.cos(ang)]]))+cnt
解决方案
问题是您试图从(100, 8)
“坐标数组”中减去“中心” - 一个 2 元素向量。在什么空间?8D?如果是这样,中心也应该是 8 个坐标的列表,因为 8D 空间中的点是通过提供其沿 8 个轴中的每一个轴的坐标来定义的。
如果坐标数组是 shape ,则您的代码有效(100, 2)
。
如果,当您说“100 个元素,每个元素有 8 个点表示(x,y)
”时,您的意思是数组中的每一行包含 4 个(不是 8 个)点(即 和 对x
)y
,例如x1
, y1
, x2
, y2
, x3
, y3
, x4
, y4
, 那么处理这个问题的最好方法是重塑你的pts
数组:
import numpy as np
def Rotate2D(pts, cnt, degree):
ang = math.radians(degree)
m = scipy.array([[scipy.cos(ang), scipy.sin(ang)],
[-scipy.sin(ang), scipy.cos(ang)]])
rpts = scipy.dot(np.reshape(pts, (pts.size // 2, 2)) - cnt, m) + cnt
rpts = np.reshape(rpts, pts.shape)
推荐阅读
- laravel - 通过虚拟主机和端口进行 API 访问?
- python - Python:与 MacOS 相比,Windows10 上的 Scipy 非常慢
- r - 如何将变量从一个 R 脚本重用到另一个?
- reactjs - 打字稿扩展 React.Component
- smartsheet-api - 有关 SmartSheet API 和创建用户界面的一般问题
- excel - 从列表框更新数据
- r - JAGS模型中“inprod function不符合参数”的处理方法
- c# - DropDownListFor 正在更改我放在缓存上的 SelectedItem
- python - 使用 pandas 数据框和 matplotlib 将 csv 文件中的数据操作到绘图中
- algorithm - 将 N 个唯一元素排序为唯一对,然后将它们排序为 X 个唯一的 Y 对组