OpenCVを使用してPythonで特定の(多くの場合非常に小さい)角度で特定の点を中心に画像を回転させる例を見つけるのに苦労しています。
これは私がこれまで持っていたものですが、非常に奇妙な結果の画像を生成しますが、やや回転しています:
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
Cv2バージョンを使用していると仮定すると、そのコードは回転する画像の中心を見つけ、変換行列を計算して画像に適用します。
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
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)
上記のソリューションのいくつかに問題があり、正しい「bounding_box」または新しいサイズの画像を取得しました。したがって、ここに私のバージョンがあります
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
@ 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)
Opencv python-を使用して画像を簡単に回転できます
_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)
_
トラックバーを作成する場合は、cv2.createTrackbar()
を使用してトラックバーを作成し、メインスクリプトからfuncRotate()
fucntionを呼び出します。その後、必要な程度に簡単に回転できます。実装に関する詳細もここで見つけることができます- opencv のトラックバーを使用して、画像を任意の角度で回転させます
単純にimutilsパッケージを使用してローテーションを実行できます。 2つの方法があります
このブログで入手できる詳細情報: https://www.pyimagesearch.com/2017/01/02/rotate-images-correctly-with-opencv-and-python/