2012-05-11 62 views
5

如何使用OpenCV旋转视频流中的所有帧?我尝试使用similar question中提供的代码,但它似乎不适用于返回cv.RetrieveFrame的Iplimage图像对象。如何使用OpenCV旋转视频

这是我目前拥有的代码:

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。根据C++ cheatsheet,两者之间的转换是微不足道的,但我找不到任何关于在Python中执行等同的文档。如何将Python中的Iplimage转换为Mat?

回答

10

如果你只是一个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) 

此: enter image description here变,这样:enter image description here

2

你不需要使用warpAffine(),看看transpose()flip()

This post演示如何将图像旋转90度。

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