美文网首页
opencv图像旋转矩阵

opencv图像旋转矩阵

作者: 欠我的都给我吐出来 | 来源:发表于2020-12-28 17:02 被阅读0次

在Python opencv中图像旋转矩阵可以用来旋转源图片到目标图片、旋转源坐标点到目标坐标点。根据图像旋转矩阵还可以逆向根据目标坐标点得到原始点的位置。

将常用的旋转函数汇总一下

1. 根据中心坐标点旋转图片

# 输入为三通道图片以及需要顺时针旋转的角度
def rotate_image(image, angle):
    (h, w) = image.shape[:2]
    (cX, cY) = (w // 2, h // 2)
    M = cv2.getRotationMatrix2D((cX, cY), angle, 1.0)
    cos = np.abs(M[0, 0])
    sin = np.abs(M[0, 1])
    nW = int((h * sin) + (w * cos))
    nH = int((h * cos) + (w * sin))
    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)),M

下面是另一个类似的

def func1(image,degree):
    height, width = image.shape[:2]
    heightNew = int(width * fabs(sin(radians(degree))) + height * fabs(cos(radians(degree))))
    widthNew = int(height * fabs(sin(radians(degree))) + width * fabs(cos(radians(degree))))
    matRotation = cv2.getRotationMatrix2D((width / 2, height / 2), -degree, 1)
    matRotation[0, 2] += (widthNew - width) / 2
    matRotation[1, 2] += (heightNew - height) / 2
    imgRotation = cv2.warpAffine(image, matRotation, (widthNew, heightNew), borderValue=(255, 255, 255))
    return imgRotation, matRotation

2. 坐标点进行旋转操作

def rotate_boxes(boxes,angle,h,w):
    (cX, cY) = (w // 2, h // 2)
    M = cv2.getRotationMatrix2D((cX, cY), angle, 1.0)
    cos = np.abs(M[0, 0])
    sin = np.abs(M[0, 1])
    nW = int((h * sin) + (w * cos))
    nH = int((h * cos) + (w * sin))
    M[0, 2] += (nW / 2) - cX
    M[1, 2] += (nH / 2) - cY
    points = np.array(boxes).reshape((4,2))
    ones = np.ones(shape=(4, 1))
    points_ones = np.concatenate((points, ones), axis=1)

    transformed_pts = M.dot(points_ones.T).T
    return transformed_pts 

3. 根据目标坐标点得到源坐标点

小角度可以采用这样的方式,但是这个代码存在一个问题,这是根据矩阵的乘法逆推到的,当h1=0或者 (h2 * h4 - h1 * h5)=0的时候,结果会有问题。

def transformPTs_inverse(pts, H):
    H_inverse = np.linalg.pinv(H)
    pts = np.array(pts)
    num = pts.shape[0]
    newpts = []
    h1, h2, h3, h4, h5, h6 = H[0][0], H[0][1], H[0][2], H[1][0], H[1][1], H[1][2]
    for i in range(num):
        x1, y1 = pts[i]
        y0 = (x1 * h4 - y1 * h1 - h3 * h4 + h1 * h6) / (h2 * h4 - h1 * h5)
        x0 = (x1 - h3 - h2*y0)/h1
        newpts.append([int(x0), int(y0)])
    repts = np.array([newpts[3], newpts[0], newpts[1], newpts[2]])
    return rept

第二种方法:


def transformPTs_inverse_homography(pts, H):
    H_inverse = np.linalg.pinv(H)
    pts = np.array(pts)
    num = pts.shape[0]
    newpts = []
    for i in range(num):
        newpt = np.dot(H_inverse, pts[i].tolist() + [1])
        newpt = newpt/newpt[-1] # Homogeneous
        newpts.append(newpt[:-1])
    newpts = np.array(newpts)
    return newpts

对于大角度比如90,180,270度角,可以采用一种比较笨的方法

# 这里的输入pts是长度为8的数组,分别为左上角、右上角、左下角、右下角的顺序。
def stupid_inverse(pts, angle, H):
    pts = np.array(pts).reshape((4, 2))
    num = pts.shape[0]
    h1, h2, h3, h4, h5, h6 = H[0][0], H[0][1], H[0][2], H[1][0], H[1][1], H[1][2]
    newpts = []
    if angle == 90:
        for i in range(num):
            x1, y1 = pts[i]
            x0 = h6 - y1
            y0 = x1 - h3
            newpts.append([int(x0), int(y0)])
        repts = np.array([newpts[2], newpts[0], newpts[3], newpts[1]])
    elif angle == 180:
        for i in range(num):
            x1, y1 = pts[i]
            x0 = h3 - x1
            y0 = h6 - y1
            newpts.append([int(x0), int(y0)])
        repts = np.array([newpts[3], newpts[2], newpts[1], newpts[0]])
    elif angle == 270:
        for i in range(num):
            x1, y1 = pts[i]
            x0 = y1
            y0 = h3 - x1
            newpts.append([int(x0), int(y0)])
        repts = np.array([newpts[1], newpts[3], newpts[0], newpts[2]])

    else:
        repts = pts
    repts = repts.reshape(-1)
    return repts

自己常用的函数,怕忘了,所以记录一下。

相关文章

  • opencv图像旋转矩阵

    在Python opencv中图像旋转矩阵可以用来旋转源图片到目标图片、旋转源坐标点到目标坐标点。根据图像旋转矩阵...

  • 正确使用OpenCV和Python旋转图像

    使用OpenCV和Python旋转图像 其中,旋转矩阵中前两列控制旋转,最后一列控制其位置(即平移) 我们先定义了...

  • leecode刷题(10)-- 旋转图像

    leecode刷题(10)-- 旋转图像 旋转图像 描述: 给定一个 n × n 的二维矩阵表示一个图像。 将图像...

  • 深度学习 数据增强之图片及标注框旋转

    参考:python 简单图像处理(4) 旋转 方法二(使用opencv,旋转后的图片更加清晰)

  • leetcode 48.图像旋转 及LCP 2. 黑白方格画

    48.图像旋转给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。说明:你必须在原地旋转图像...

  • LeedCode 旋转图像

    LeetCode 旋转图像 给定一个 *n *× n 的二维矩阵表示一个图像。 将图像顺时针旋转 90 度。 思路...

  • Swift 旋转图像 - LeetCode

    题目:旋转图像 描述: 给定一个 n × n 的二维矩阵表示一个图像。 将图像旋转 90 度(顺时针)。 注意: ...

  • OpenCV实现图像旋转

    不知道是不是因为太简单,OpenCV不屑于去封装还是怎么回事,OpenCV中并没有一个API是专门用于实现图像任意...

  • LeetCode-48-旋转图像

    LeetCode-48-旋转图像 题目 给定一个 n × n 的二维矩阵表示一个图像。 将图像顺时针旋转 90 度...

  • Mat - 基本的图像容器

    目标 熟悉OPENCV如何存储及处理图像。 Mat Mat由2部分组成:矩阵头和指向矩阵值的指针 上述只是复制矩阵...

网友评论

      本文标题:opencv图像旋转矩阵

      本文链接:https://www.haomeiwen.com/subject/ljltoktx.html