如何使用OpenCV旋转视频流中的所有帧?我尝试使用similar question中提供的代码,但它似乎不适用于返回cv.RetrieveFrame的Iplimage图像对象。
这是我目前的代码:
import cv, cv2
import numpy as np
def rotateImage(image, angle):
if hasattr(image, 'shape'):
image_center = tuple(np.array(image.shape)/2)
shape = image.shape
elif hasattr(image, 'width') and hasattr(image, 'height'):
image_center = (image.width/2, image.height/2)
shape = np.array((image.width, image.height))
else:
raise Exception, 'Unable to acquire dimensions of image for type %s.' % (type(image),)
rot_mat = cv2.getRotationMatrix2D(image_center, angle,1.0)
result = cv2.warpAffine(image, rot_mat, shape, flags=cv2.INTER_LINEAR)
return result
cap = cv.CaptureFromCAM(cam_index)
#cap = cv.CaptureFromFile(path)
fps = 24
width = int(cv.GetCaptureProperty(cap, cv.CV_CAP_PROP_FRAME_WIDTH))
height = int(cv.GetCaptureProperty(cap, cv.CV_CAP_PROP_FRAME_HEIGHT))
fourcc = cv.CV_FOURCC('P','I','M','1') #is a MPEG-1 codec
writer = cv.CreateVideoWriter('out.avi', fourcc, fps, (width, height), 1)
max_i = 90
for i in xrange(max_i):
print i,max_i
cv.GrabFrame(cap)
frame = cv.RetrieveFrame(cap)
frame = rotateImage(frame, 180)
cv.WriteFrame(writer, frame)
但这只是给出错误:
File "test.py", line 43, in <module>
frame = rotateImage(frame, 180)
File "test_record_room.py", line 26, in rotateImage
result = cv2.warpAffine(image, rot_mat, shape, flags=cv2.INTER_LINEAR)
TypeError: <unknown> is not a numpy array
大概是因为warpAffine需要一个CvMat而不是Iplimage。根据{{3}},两者之间的转换是微不足道的,但我找不到任何关于在Python中做等效的文档。如何在Python中将Iplimage转换为Mat?
答案 0 :(得分:11)
如果你刚刚旋转180度,你可以在两个轴上使用Flip
,
取代:
frame = rotateImage(frame, 180)
使用:
cv.Flip(frame, flipMode=-1)
这是“就地”,所以它很快,你将不再需要你的rotateImage
功能:)
示例:
import cv
orig = cv.LoadImage("rot.png")
cv.Flip(orig, flipMode=-1)
cv.ShowImage('180_rotation', orig)
cv.WaitKey(0)
此: 成为:
答案 1 :(得分:2)
您无需使用warpAffine()
,请查看transpose()
和flip()
。
This post演示了如何将图像旋转90度。
答案 2 :(得分:2)
通过反复试验,我最终发现了解决方案。
import cv, cv2
import numpy as np
def rotateImage(image, angle):
image0 = image
if hasattr(image, 'shape'):
image_center = tuple(np.array(image.shape)/2)
shape = tuple(image.shape)
elif hasattr(image, 'width') and hasattr(image, 'height'):
image_center = tuple(np.array((image.width/2, image.height/2)))
shape = (image.width, image.height)
else:
raise Exception, 'Unable to acquire dimensions of image for type %s.' % (type(image),)
rot_mat = cv2.getRotationMatrix2D(image_center, angle,1.0)
image = np.asarray( image[:,:] )
rotated_image = cv2.warpAffine(image, rot_mat, shape, flags=cv2.INTER_LINEAR)
# Copy the rotated data back into the original image object.
cv.SetData(image0, rotated_image.tostring())
return image0
答案 3 :(得分:2)
这对我有用:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
flipped = cv2.flip(gray, flipCode = 1)
cv2.imshow('frame',flipped)
答案 4 :(得分:0)
opencv。版本 = 3.4.2
_,框架= cap.read() frame = cv2.rotate(frame,cv2.ROTATE_90_CLOCKWISE)