2017-08-22 83 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的中值計算(據推測在整個堆棧中)。問題是,這結束與文件被轉換成與後計算

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成UINT8來解決這個問題,但我也試圖將float64轉換成BGR食堂一個float64數組,代碼正在嘗試但未能完成。

+1

爲什麼不將[中位數模糊](http://docs.opencv.org/3.1.0/d4/d86/group__imgproc__filter.html#ga564869aa33e58769b4469101aac458f9)從opencv直接添加到圖像之前? (它支持BGR圖像,但通道被分開處理) – api55

+0

我需要保持圖像的分辨率,因爲我將在第二步中進行背景減除。該代碼將用於許多不同的視頻文件,每個視頻文件都有微小差異。最終目標是跟蹤,因此我認爲最好爲每個視頻計算中間幀並執行減法。 –

+1

哦,我現在找到了你,所以你想得到所有圖像上的每個像素的中值,而不是同一圖像中的鄰域。那麼float64應該是numpy(參見[docs](https://docs.scipy.org/doc/numpy/reference/generated/numpy.median.html)) – api55

回答

0

所以你的第一部分是正確的。

問題是你得到一個float64矩陣。您可以使用numpy中的astype將其轉換爲另一個需要的。但是,你可能會失去信息:(

先嚐試四捨五入的數量或選擇ceilfloor,因爲你需要得到你所期望的。

另外請記住,如果你這樣做減法,你可能會得到負數.. ..你也應該對其進行管理我的意思是這條線:

subframe = gray-medst 

而另一位意見更多:

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

這給你相同的灰度圖像,但有3個通道(全部使用相同的數字)不知道這是你想要的。

+0

我實際上在減法期間的負值計數。我試圖跟蹤視頻中的黑色物體,他們通常在負面斑點出現在處理後的圖片 爲什麼我需要3個通道我需要保存一個沒有背景的自由移動的斑點的視頻,我想到灰度和減法後,我可以將它轉換回BGR並保存。似乎正在工作,雖然 –

+1

@ Hojo.Timberwolf BGR灰度是一個有損轉換,你鬆散的信息,無法改造。如果您嘗試查找特定顏色的斑點,請嘗試使用inrange並從中創建一個二進制圖像。像[this](http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html) – api55

+0

我會仔細研究一下。我實際上使用紅外攝像機和濾波器來記錄信號,因此理論上所有通道應該是相同的。但是我確實注意到了3個通道之間的小差異。 –