OpenCV Python围绕特定点旋转图像X度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV Python围绕特定点旋转图像X度相关的知识,希望对你有一定的参考价值。

我很难找到使用OpenCV在Python中以特定(通常非常小)的角度围绕特定点旋转图像的示例。

这是我到目前为止所做的,但它会产生一个非常奇怪的结果图像,但它有点旋转:

def rotateImage( image, angle ):
    if image != None:
        dst_image = cv.CloneImage( image )

        rotate_around = (0,0)
        transl = cv.CreateMat(2, 3, cv.CV_32FC1 )

        matrix = cv.GetRotationMatrix2D( rotate_around, angle, 1.0, transl )
        cv.GetQuadrangleSubPix( image, dst_image, transl )
        cv.GetRectSubPix( dst_image, image, rotate_around )

    return dst_image
答案
import numpy as np

def rotateImage(image, angle):
  image_center = tuple(np.array(image.shape[1::-1]) / 2)
  rot_mat = cv2.getRotationMatrix2D(image_center, angle, 1.0)
  result = cv2.warpAffine(image, rot_mat, image.shape[1::-1], flags=cv2.INTER_LINEAR)
  return result

假设您使用的是cv2版本,该代码会找到您要旋转的图像的中心,计算变换矩阵并应用于图像。

另一答案

或者更容易使用SciPy

from scipy import ndimage

#rotation angle in degree
rotated = ndimage.rotate(image_to_rotate, 45)

有关更多用法信息,请参阅here

另一答案

cv2.warpAffine函数以相反的顺序获取shape参数:(col,row),上面的答案没有提及。这对我有用:

import numpy as np

def rotateImage(image, angle):
    row,col = image.shape
    center=tuple(np.array([row,col])/2)
    rot_mat = cv2.getRotationMatrix2D(center,angle,1.0)
    new_image = cv2.warpAffine(image, rot_mat, (col,row))
    return new_image
另一答案
def rotate(image, angle, center = None, scale = 1.0):
    (h, w) = image.shape[:2]

    if center is None:
        center = (w / 2, h / 2)

    # Perform the rotation
    M = cv2.getRotationMatrix2D(center, angle, scale)
    rotated = cv2.warpAffine(image, M, (w, h))

    return rotated
另一答案
import imutils

vs = VideoStream(src=0).start()
...

while (1):
   frame = vs.read()
   ...

   frame = imutils.rotate(frame, 45)

更多:https://github.com/jrosebr1/imutils

另一答案

快速调整@ alex-rodrigues答案......处理包括频道数量在内的形状。

import cv2
import numpy as np

def rotateImage(image, angle):
    center=tuple(np.array(image.shape[0:2])/2)
    rot_mat = cv2.getRotationMatrix2D(center,angle,1.0)
    return cv2.warpAffine(image, rot_mat, image.shape[0:2],flags=cv2.INTER_LINEAR)
另一答案

我遇到了一些上述解决方案的问题,获得了正确的“bounding_box”或图像的新尺寸。因此这是我的版本

def rotation(image, angleInDegrees):
    h, w = image.shape[:2]
    img_c = (w / 2, h / 2)

    rot = cv2.getRotationMatrix2D(img_c, angleInDegrees, 1)

    rad = math.radians(angleInDegrees)
    sin = math.sin(rad)
    cos = math.cos(rad)
    b_w = int((h * abs(sin)) + (w * abs(cos)))
    b_h = int((h * abs(cos)) + (w * abs(sin)))

    rot[0, 2] += ((b_w / 2) - img_c[0])
    rot[1, 2] += ((b_h / 2) - img_c[1])

    outImg = cv2.warpAffine(image, rot, (b_w, b_h), flags=cv2.INTER_LINEAR)
    return outImg
另一答案

您可以使用opencv python-轻松旋转图像

def funcRotate(degree=0):
    degree = cv2.getTrackbarPos('degree','Frame')
    rotation_matrix = cv2.getRotationMatrix2D((width / 2, height / 2), degree, 1)
    rotated_image = cv2.warpAffine(original, rotation_matrix, (width, height))
    cv2.imshow('Rotate', rotated_image)

如果您正在考虑创建一个跟踪栏,那么只需使用cv2.createTrackbar()创建一个跟踪栏,然后从主脚本中调用funcRotate()fucntion。然后,您可以轻松地将其旋转到您想要的任何程度。关于实施的完整细节可以在这里找到 - Rotate images at any degree using Trackbars in opencv

以上是关于OpenCV Python围绕特定点旋转图像X度的主要内容,如果未能解决你的问题,请参考以下文章

使用OpenCV旋转点周围的点

在图像[OpenCV / Python]中查找[x,y]旋转坐标位置

图像旋转后如何重新映射点?

OpenCV 完整例程27. 图像的旋转(以任意点为中心)

在OpenGL中围绕特定点旋转对象

如何使用MATLAB围绕不是图像中心点的点旋转图像?