OpenCV Python围绕特定点旋转图像X度
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV Python围绕特定点旋转图像X度相关的知识,希望对你有一定的参考价值。
我很难找到使用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版本,该代码会找到您要旋转的图像的中心,计算变换矩阵并应用于图像。
另一答案
或者更容易使用SciPy
from scipy import ndimage
#rotation angle in degree
rotated = ndimage.rotate(image_to_rotate, 45)
有关更多用法信息,请参阅here 。
另一答案
cv2.warpAffine函数以相反的顺序获取shape参数:(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)
更多:https://github.com/jrosebr1/imutils
另一答案
快速调整@ 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)
另一答案
我遇到了一些上述解决方案的问题,获得了正确的“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
另一答案
您可以使用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。然后,您可以轻松地将其旋转到您想要的任何程度。关于实施的完整细节可以在这里找到 - Rotate images at any degree using Trackbars in opencv
以上是关于OpenCV Python围绕特定点旋转图像X度的主要内容,如果未能解决你的问题,请参考以下文章