2012-01-27 10 views
20

OpenCVを使ってPythonで特定の点(しばしば非常に小さな角度)で画像を回転させる例が見つからない。OpenCV Python特定の点を中心にX度で画像を回転する

これは私がこれまで持っているものですが、それは非常に奇妙な結果の画像を生成し、それが多少回転している:あなたはCV2のバージョンを使用していると仮定すると、

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 

答えて

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 

、そのコードが見つかりました回転させたい画像の中心を計算し、変換行列を計算して画像に適用します。

+0

おかげで、しかし私は "CV" モジュールを使用していますし、あなたがそう、 "CV2" を使用していますその "image.shape"についての不平は特に存在しません。私は今まで "cv"モジュールを使っていただけなので、まだ "cv2"ですべての変更を取得していません。私は自分のイメージが(140,140)であることを知っているので、image.shapeの代わりにハードコーディングを試みましたが、それはまったく好きではありませんでした。 – Mike

+1

私はいくつかの進歩を遂げたかもしれないが、まだ問題に陥っていると思う。ここでは最新のコードです: 結果= cv2.warpAffine(画像、rot_mat、cv.GetSize(画像)、フラグ= cv2.INTER_LINEAR) トレースバック(最後の最新の呼び出し): 結果= cv2.warpAffine(画像、rot_mat、cv.GetSize(画像)、フラグ= cv2.INTER_LINEAR) 例外TypeError:がnumpyのアレイ – Mike

+14

Iは cv2.getRotationMatrix2D(中心= image_center、角=角度、スケール= 1) を実行して問題がありませんTypeError:関数は正確に2つの引数を取ります(3与えられます) – Hani

2

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

または、はるかに簡単に使用 SciPy

from scipy import ndimage 

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

より多くの使用状況の情報のため here を参照してください。

+0

pngのディレクトリをループしていますが、これを実行していますが、RuntimeError:invalid rotation planeが指定されています。すべての修正? –

+0

あなたは開いているCV画像を渡しますか?次のようになります:img = cv2.imread( 'messi5.jpg'、0) – fivef

+3

これは私にとってはかなり遅いです –

4

cv2.warpAffine関数は、形状パラメータを逆の順序で取ります:上記の答えには言及していない(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 
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) 

より:助けをhttps://github.com/jrosebr1/imutils

+0

これはイメージのいずれかをカットしません: 'imutils.rotate_bound(frame、90)' –

関連する問題