10

OpenCVを使用してビデオストリームのすべてのフレームをどのように回転させますか?同様の質問で提供されたコードを使用してみましたが、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はIplimageではなくCvMatを使用するためです。C ++のチートシートによると、この2つを変換するのは簡単ですが、Pythonで同等の処理を行うためのドキュメントは見つかりません。PythonでIplimageをMatに変換するにはどうすればよいですか?

4

5 に答える 5

13

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)

これ: ここに画像の説明を入力になり、これ:ここに画像の説明を入力

于 2012-05-12T01:59:05.730 に答える
3

試行錯誤の末、最終的に解決策を発見しました。

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
于 2012-05-12T01:07:50.583 に答える
2

を使用する必要はありません。warpAffine()を見てtranspose()くださいflip()

この投稿では、画像を90度回転させる方法を示します。

于 2012-05-11T21:47:37.570 に答える