2017-08-18 7 views
2

Ci-dessous il y a une partie d'un code qui fait osciller les images par une ligne simple:Rotation des images ne fonctionne pas

for i in range(num_images): 
    im = cv2.imread(roidb[i]['image']) 
    if roidb[i]['hflipped']: 
     im = im[:, ::-1, :] 
    if roidb[i]['vflipped']: 
     im = im[::-1, :, :] 

Les moyens hflipped flipping images horizontalement et les moyens vflipped en les retournant verticalement. Je veux ajouter une autre partie pour faire pivoter chaque image par 90 degrés dans le sens antihoraire.

J'ai essayé 2 options, mais aucun d'entre eux fonctionne:

1)

if roidb[i]['rotated']: 
    im = im.rotate(im, 90) 

2)

num_rows, num_cols = im.shape[:2] 
if roidb[i]['rotated']: 
    rotation_matrix = cv2.getRotationMatrix2D((num_cols/2, num_rows/2), 90, 1) 
    img_rotation = cv2.warpAffine(im, rotation_matrix, (num_cols, num_rows)) 

est-il un moyen de faire pivoter les images similaires à flipping ? Ou il y a un meilleur moyen?

Merci

+0

Pouvez-vous être plus précis sur les résultats que vous déclarez ne pas travailler? –

Répondre

3

Parce que les emballages de Python à utiliser OpenCV numpy comme backend, envisagez d'utiliser numpy.rot90 qui est spécifiquement conçu pour tourner des matrices par multiples de 90 degrés. Cela fonctionne également pour les images couleur dont les dimensions horizontales et verticales sont pivotées indépendamment par canal. Le deuxième paramètre est un multiple k qui spécifie combien de multiples de 90 degrés vous souhaitez faire pivoter l'image. Les valeurs positives effectuent une rotation dans le sens inverse des aiguilles d'une montre tandis que les valeurs négatives effectuent une rotation dans le sens des aiguilles d'une montre. Dans votre cas, spécifiez le deuxième paramètre comme k=1 pour faire pivoter de 90 degrés dans le sens anti-horaire. Par coïncidence, la valeur par défaut pour le second paramètre est k=1, vous pouvez donc l'omettre. Si vous vouliez tourner dans le sens des aiguilles d'une montre, vous devez spécifier k=-1.

Ajoutant cette logique à votre code serait comme suit:

import numpy as np 

# Your setup code goes here... 
# ... 
# ... 

# Main code in question 
for i in range(num_images): 
    im = cv2.imread(roidb[i]['image']) 
    if roidb[i]['hflipped']: 
     im = im[:, ::-1, :] 
    if roidb[i]['vflipped']: 
     im = im[::-1, :, :] 
    if roidb[i]['rotated']: # New 
     im = np.rot90(im, k=1) # Rotates 90 degrees anti-clockwise 
     #im = np.rot90(im) # Also rotates 90 degrees anti-clockwise 
     #im = np.rot90(im, k=-1) # Rotates 90 degrees clockwise 

    # ... 
    # The rest of your code follows