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
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.
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
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)
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
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)
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
Vous pouvez simplement utiliser le paquet imutils pour effectuer la rotation. il a deux méthodes
plus d'informations que vous pouvez obtenir sur ce blog: https://www.pyimagesearch.com/2017/01/02/rotate-images-correctly-with-opencv-and-python/