web-dev-qa-db-fra.com

OpenCV Python faire pivoter l'image de X degrés autour d'un point spécifique

J'ai du mal à trouver des exemples de rotation d'une image autour d'un point spécifique selon un angle spécifique (souvent très petit) en Python en utilisant OpenCV.

C'est ce que j'ai jusqu'à présent, mais cela produit une image résultante très étrange, mais elle est quelque peu tournée:

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
37
Mike
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

En supposant que vous utilisez la version cv2, ce code trouve le centre de l'image que vous souhaitez faire pivoter, calcule la matrice de transformation et s'applique à l'image.

45
Alex Rodrigues

Ou une utilisation beaucoup plus facile SciPy

from scipy import ndimage

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

voir ici pour plus d'informations sur l'utilisation.

29
fivef

La fonction cv2.warpAffine prend le paramètre de forme dans l'ordre inverse: (col, ligne) que les réponses ci-dessus ne mentionnent pas. Voici ce qui a fonctionné pour moi:

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
8
nicodjimenez
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
7
Omnipresent
import imutils

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

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

   frame = imutils.rotate(frame, 45)

Plus: https://github.com/jrosebr1/imutils

4
Greg Wojdyga

J'ai eu des problèmes avec certaines des solutions ci-dessus, avec l'obtention de la "bounding_box" correcte ou de la nouvelle taille de l'image. Voici donc ma version

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
4
JTIM

Quick Tweak to @ alex-rodrigues answer ... traite de la forme, y compris le nombre de canaux.

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)
3
alcoholiday

Vous pouvez facilement faire pivoter les images en utilisant pencon opencv

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)

Si vous songez à créer une barre de suivi, créez simplement une barre de suivi à l'aide de cv2.createTrackbar() et appelez la fonction funcRotate() à partir de votre script principal. Ensuite, vous pouvez facilement le faire pivoter à n'importe quel degré. Des détails complets sur la mise en œuvre peuvent également être trouvés ici- Faites pivoter les images à n'importe quel degré en utilisant les barres de suivi en opencv

1

Vous pouvez simplement utiliser le paquet imutils pour effectuer la rotation. il a deux méthodes

  1. rotation : faire pivoter l'image selon l'angle spécifié. cependant l'inconvénient est que l'image peut être rognée si ce n'est pas une image carrée.
  2. Rotate_bound : il surmonte le problème rencontré avec la rotation. Il ajuste la taille de l'image en conséquence lors de la rotation de l'image.

plus d'informations que vous pouvez obtenir sur ce blog: https://www.pyimagesearch.com/2017/01/02/rotate-images-correctly-with-opencv-and-python/

0
Vaibhav K