1

私は以下を使用してフレームごとにビデオを読んでいます:

vc = cv2.VideoCapture('test.avi')

その後、以下をframe使用してが読み取られたかどうかを確認します。

if vc.isOpened():
    rval,frame = vc.read()
else:
    rval = False

frame次のコードを使用してこれをnumpy配列に変換しようとすると、問題が発生します。

PILImage = Image.fromstring("L",cv.GetSize(frame),frame.tostring())
NumPyArray = np.array(PILImage)

次のようなエラーが発生します。

CvArr argument 'arr' must be IplImage, CvMat or CvMatND. Use fromarray() to convert numpy arrays to CvMat or cvMatND

VideoCapture :: readのドキュメントから、2つのものが返されることがわかりました[retVal,Image]。パーツのみを取得するにはどうすればよいImageですか?また、それをNumpy Arrayに変換するにはどうすればよいですか?

詳細情報: 基本的にこれを行う際の要点は、スペースバーを押してビデオの各フレームを通過し、任意のフレームから特定の領域を選択してjpgとして保存できるプログラムを作成しようとしているということです。コードは次のとおりです。

from ITMS import ITMS
import cv2
from cv2 import cv
import numpy as np
import matplotlib.pyplot as plt
import Image
import matplotlib.widgets as widgets

def onselect(eclick, erelease):
    if eclick.ydata>erelease.ydata:
        eclick.ydata,erelease.ydata=erelease.ydata,eclick.ydata
    if eclick.xdata>erelease.xdata:
        eclick.xdata,erelease.xdata=erelease.xdata,eclick.xdata
    ax.set_ylim(erelease.ydata,eclick.ydata)
    ax.set_xlim(eclick.xdata,erelease.xdata)
    fig.canvas.draw()

def subImager(arr):
    fig = plt.figure()
    ax = fig.add_subplot(111)

    plt_image=plt.imshow(arr,cmap="Greys_r")
    rs=widgets.RectangleSelector(
        ax, onselect, drawtype='box',
        rectprops = dict(facecolor='red', edgecolor = 'red', alpha=0.2, fill=True))
    plt.show()


cv2.namedWindow("preview")
vc = cv2.VideoCapture('test.avi')

if vc.isOpened():
    rval,frame = vc.read()
else:
    rval = False

while rval:
    key = cv2.waitKey(30)
        if key==32:
            cv2.imshow("preview", frame)
            NumPyArray=ITMS.CVtoNPArray(frame)
            subImager(NumPyArray)
            rval,frame = vc.read()
        elif key==27:
            break

cv2.destroyAllWindows()

ITMSクラス:

from cv2 import cv
import cv2
import numpy as np
from PIL import Image

class ITMS:
    def __init__(self):
        pass

    def CVtoNPArray(CVImage):
        PILImage = Image.fromstring("L",cv.GetSize(CVImage),CVImage.tostring())
        NumPyArray = np.array(PILImage)
        return NumPyArray
        CVtoNPArray=staticmethod(CVtoNPArray)
4

1 に答える 1

5

あなたは物事を複雑にしすぎています、あなたのframe名前で返される画像はすでにnumpy配列です。に変換したい場合はPIL、単にImage.fromarray(frame)

于 2013-01-23T19:19:55.187 に答える