首页 > 解决方案 > 如何围绕图像中心旋转多个矩形坐标

问题描述

在测试计算机视觉算法对象检测时,通过旋转测试图像可以检测到一些遗漏的对象。通过这样做,矩形中每个点的 (x,y) 坐标表示的那些检测到的对象位置应该向后旋转。对象检测器的输出是一个 Numpy 数组,它包含例如 100 个元素,每个元素具有 4 个对点,表示检测到的对象周围矩形的 (x,y) 坐标,即具有 (100,8) 形状的 Numpy 数组。这些对象是在原始图像的旋转版本中检测到的。因此,必须将它们旋转回来才能在原始图像上进行可视化。原始图像的分辨率为 5616x3744px,因此旋转 90 度的版本为 3744x5616px。

问题是我们如何将所有这些点围绕图像中心旋转成一条线,我们认为是(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

标签: pythonimagenumpyscipy

解决方案


问题是您试图从(100, 8)“坐标数组”中减去“中心” - 一个 2 元素向量。在什么空间?8D?如果是这样,中心也应该是 8 个坐标的列表,因为 8D 空间中的点是通过提供其沿 8 个轴中的每一个轴的坐标来定义的。

如果坐标数组是 shape ,则您的代码有效(100, 2)


如果,当您说“100 个元素,每个元素有 8 个点表示(x,y)时,您的意思是数组中的每一行包含 4 个(不是 8 个)点(即 和 对xy,例如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)

推荐阅读