2012-03-23 8 views
2

私はビデオストリームを処理するためにPythonでOpenCVを使用しています。独自のアルゴリズムを実装したいので、各フレームを繰り返し処理する必要があります。OpenCVを使用してPythonでCvMatを反復する最も速い方法は何ですか?

私はこれまでのところ動作していますが、リアルタイムでは遅すぎます。私はPythonが最も効率的なプログラミング言語ではないことを知っていますが、組み込みの画像変換関数は非常に高速であるため、これよりもはるかに優れていると考えています。ナンシーは行く方法かもしれないが、私はまだそれに精通していない。

import cv, numpy 
vidFile = cv.CaptureFromFile('sample.avi') 
nFrames = int( cv.GetCaptureProperty(vidFile, cv.CV_CAP_PROP_FRAME_COUNT)) 
for f in xrange(nFrames): 
    frameImg = cv.QueryFrame(vidFile) 
    frameMat=cv.GetMat(frameImg) 
    print "mat ", mat[3,1] 
    for x in xrange(frameMat.cols): 
    for y in xrange(frameMat.rows): 
     # just an example, multiply all 3 components by 0.5 
     frameMat[y, x] = tuple(c*0.5 for c in frameMat[y, x]) 
    cv.ShowImage("My Video Window", frameMat) 
    if cv.WaitKey(waitPerFrameInMillisec ) == 27: 
    break 

どのように処理を高速化できますか? ありがとう、b_m

答えて

3

OpenCVにはかなり良いpythonのドキュメントhereがあります。基本的には、これらの組み込みのopencv関数、つまりnumpyを使用して、常にビデオフレームの操作を試みるべきです。フレーム処理のためにあなたはとてつもなく遅いピクセル処理ループによってあなたの全体のピクセルを置き換えることができ、これを使用して、operations on arraysを見てみましょう:

frameMat=cv.GetMat(frameImg) 
print "mat ", mat[3,1] 
for x in xrange(frameMat.cols): 
    for y in xrange(frameMat.rows): 
     # just an example, multiply all 3 components by 0.5 
     frameMat[y, x] = tuple(c*0.5 for c in frameMat[y, x]) 
cv.ShowImage("My Video Window", frameMat) 

をして:

cv.ConvertScale(frameImg, frameImg, scale=0.5) 
cv.ShowImage("My Video Window", frameImg) 

、簡単にリアルタイムでそれを再生あなたがビデオなどをマージすることを可能にするクールな機能の負荷があります。

+0

これは正しい方法だと私は知っていますが、今は配列をループせずに実行できない操作を行う必要があります。まあ、それは可能かもしれませんが、私はそれを理解する方法はありません。たとえば、イメージの最初の(左上)赤のピクセルはどのようにして見つけられますか?これらのものは、ループを持つケーキの一片でしょう。 –

+1

@b_m - 'frameImg [0,0]'は左上のピクセルのRGB値を与えます。あなたは実際に何をしたいのか説明できますか?その後、もっと助けることができるかもしれません; – fraxel

+0

私は赤色の最初のピクセルを意味します。私は長期的に何をしたいのか分かりません、ちょうどループを使用することは避けられません。 –

1

ループのPythonは遅すぎます。組み込み関数(またはnumpyまたは別の拡張モジュール)を使用してアルゴリズムを表現できる場合は、それを行います。たとえば、定数を乗算する例は、ConvertScaleで簡単に実装できます。アルゴリズムがより複雑な場合は、Cレベルで実装する必要があります。それをより簡単にするための一般的な方法の1つはCythonです。

+0

これは良いアイデアかもしれない、私はそれを調べます。 opencv-cythonと呼ばれるプロジェクトがありますが、opencv2.0を使用しています。 –

関連する問題