2012-01-27 16 views
20

Mam trudności ze znalezieniem przykładów obracania obrazu wokół określonego punktu o określony (często bardzo mały) kąt w Pythonie przy użyciu OpenCV.Python OpenCV obraca obraz o X stopni wokół określonego punktu

To, co mam tak daleko, ale daje bardzo dziwny obraz wynikowy, ale jest nieco obrócone:

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 

Odpowiedz

23
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 

Zakładając, że używasz wersji CV2, że kod znajdzie środek obrazu, który chcesz obrócić, oblicza macierz transformacji i stosuje się do obrazu.

+0

Dzięki za pomoc, jednak używam moduł "CV" i używasz "CV2", tak narzekanie w szczególności na "image.shape" nie istnieje. Do tej pory korzystałem tylko z modułu "cv", więc nie do końca otrzymałem wszystkie zmiany z "cv2". Wiem, że mój obraz jest (140,140), więc próbowałem twardego kodowania, które zastąpiło image.shape, ale w ogóle też się to nie podobało. – Mike

+1

Myślę, że mogłem poczynić pewne postępy, ale wciąż mam problem. Oto najnowszy kod: wynik = cv2.warpAffine (zdjęcie, rot_mat, cv.GetSize (image), flagi = cv2.INTER_LINEAR) Traceback (ostatnie połączenia): ostatni wynik = cv2.warpAffine (obraz , rot_mat, cv.GetSize (obrazu), flagi = cv2.INTER_LINEAR) Błąd typu: nie jest numpy tablica – Mike

+14

że problem z uruchomieniem cv2.getRotationMatrix2D (środkowy = image_center, kąt = kąt, skala = 1) TypeError: funkcja przyjmuje dokładnie 2 argumenty (3 dane) – Hani

2

Szybkie dopasowanie do odpowiedzi @ alex-rodrigues ... dotyczy kształtu zawierającego liczbę kanałów.

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) 
18

lub znacznie łatwiejsze korzystanie SciPy

from scipy import ndimage 

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

zobaczyć here uzyskać więcej informacji użytkowania.

+0

Pętlaję się przez katalog png i robię to, ale otrzymuję RuntimeError: nieprawidłową płaszczyznę obrotu. Jakieś poprawki? –

+0

czy przekazujesz w otwartym obrazie cv? jak z: img = cv2.imread ('messi5.jpg', 0) – fivef

+3

jest to dość powolne dla mnie –

4

Funkcja cv2.warpAffine przyjmuje parametr kształtu w odwrotnej kolejności: (col, row), o których nie wspominają powyższe odpowiedzi. Oto co pracował dla mnie:

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 
7
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 
1
import imutils 

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

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

    frame = imutils.rotate(frame, 45) 

Więcej: https://github.com/jrosebr1/imutils

+0

to nie będzie cięć żadnego obrazu: 'imutils.rotate_bound (frame, 90)' –

Powiązane problemy