2017-08-22 6 views
0

ビデオの一部についてメジアン計算を実行しようとしています。私は、TIの一部を考え出したが、これはpython opencvメディアンムービー

import cv2 

camera = cv2.VideoCapture(videofile.h264) 

for i in range(0,500): 
    (grabbed,frame) = camera.read(i) 
    if not grabbed: 
     break 
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
    medstack.append(gray) 

medst = np.median(medstack,axis=0)  

コードは最初の500個のフレームを開き、Pythonのリストにそれらを格納する最も効率的な方法であるかどうかを知りません。次に、軸0(推定されるスタック全体)の中央値の計算が行われます。問題は、このファイルは、私は問題を解決するためにUINT8へのfloat64の変換について考えたが、私はまた、BGRへのfloat64に変換しようとした後の計算

while (camera.isOpened()): 
    (grabbed,frame) = camera.read() 
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
    subframe = gray-medst 
    rgbframe = cv2.cvtColor(subframe,cv2.COLOR_GRAY2BGR) 
    out.write(rgbframe) 

で台無しのfloat64に変換された状態で終わるということです配列は、コードが実行しようとしているが、失敗しています。

+1

opencvの画像を添付する前に[median blur](http://docs.opencv.org/3.1.0/d4/d86/group__imgproc__filter.html#ga564869aa33e58769b4469101aac458f9)を直接行ってみませんか? (それはBGR画像をサポートしますが、チャンネルは別々に扱われます) – api55

+0

2番目のステップでバックグラウンド減算を行うので、画像の解像度を維持する必要があります。このコードは、多くの異なるビデオファイルで使用され、それぞれには小さな違いがあります。最終目標はトラッキングであるため、各動画のメジアンフレームを計算して減算を実行することをおすすめしました。 –

+1

オハイオ州、私はあなたを今すぐ持っているので、すべての画像にわたって各ピクセルの中央値を取得したいと思います。同じ画像内の近傍ではありません。浮動小数点64はnumpyで期待されます([docs](https://docs.scipy.org/doc/numpy/reference/generated/numpy.median.html)を参照してください。 – api55

答えて

0

あなたの最初の部分は正しいです。

問題は、float64という行列が得られることです。 numpyのastypeを使用して、必要な別のキャストにキャストすることができます。しかし、あなたは情報を失うこと:(

は、最初の数字を丸めたり、あなたが期待するものを取得する必要があるとして、ceilまたはfloorを選択してみてください。

また、あなたはその減算を行う場合は、負の数を取得することを覚えておいてください。.. ..私はこの行を意味し、あなたもそれを管理する必要があります

subframe = gray-medst 

そして、別のコメントより:

rgbframe = cv2.cvtColor(subframe,cv2.COLOR_GRAY2BGR) 

これを。同じグレースケールの画像を表示しますが、3つのチャンネル(すべて同じ番号のもの)が必要な場合はわかりません。

+0

私は実際には減算の間に負の値を計算していますが、ビデオ内の黒いオブジェクトを追跡しようとしていますが、通常はビデオの黒い塊として表示されます。 なぜ私は3チャンネルが必要なのですか?自由に動くブロブのビデオをバックグラウンドなしで保存する必要があります。グレースケールと減算の後にBGRに変換して保存することができました。 –

+1

@ Hojo.Timberwolf BGRからGrayscaleへの変換は不可解な変換です。あなたは情報を取り戻すことができません。特定の色の塊を見つけようとしている場合は、inrangeを使用して、そこからバイナリイメージを作成してみてください。 [これ]のようなもの(http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html) – api55

+0

私はそれを調べます。実際にIRカメラとフィルターを使って信号を記録しているので、理論的にはすべてのチャンネルが同じでなければなりません。しかし、私は3つのチャンネルの間に小さな違いがあることに気付きました。 –