2014-01-16 26 views
4

在python中創建了一個rtsp客戶端,它接收h264流並將單個h264原始幀作爲二進制字符串返回。我正在嘗試處理每個h264幀。opencv單個h264原始幀作爲二進制字符串

我不成功地嘗試了幾種方法將此幀轉換爲numpy數組進行處理。

到目前爲止,我知道cv2.VideoCapture只接受一個文件名作爲它的參數,而不是一個幀既不是一個StringIO對象(像指向緩衝區的文件那樣的文件),但我需要傳遞給它我的字符串。

我也曾嘗試類似:

nparr = np.fromstring(frame_bin_str, np.uint8) 
img_np = cv2.imdecode(nparr, cv2.CV_LOAD_IMAGE_COLOR) 

試圖diferent標誌。但也失敗了。

經過許多其他失敗的嘗試,我跑出了想法。

總結我需要做的事情:我在一個變量中有一個h264原始幀,我需要創建一個openvc有效的numpy數組,或者以某種方式結束包含該單幀的VideoCapture對象,這樣我就可以處理框架。

任何指針將不勝感激。

希望這一切都有道理。

預先感謝您

+0

afaik openCV不支持h264原始格式。在我們當前的項目中,有人編寫了一些代碼,逐幀讀取這些文件(跳轉到給定幀號的字節位置),並根據h264格式規則手動解釋字節信息以獲取openCV可用數據。 – Micka

+0

謝謝你的迴應Micka。如果我將這些幀轉儲到帶有「\ x0 \ x00 \ x00 \ x001」分隔符的文件中。並從中創建一個VideoCapture對象。所有的作品都很完美。我可以逐幀閱讀和檢索並正確處理它們。所以我認爲支持在那裏。我不知道如何加載一個單一的框架,而不是一個文件。 – user3202342

回答

0

由於Micka建議,對於在OpenCV的H264 RAW格式不支持,我們應該把它轉換自己。

我認爲你應該將nparr重塑成傳入圖像的形狀。沒有必要做imdecode。使用imshow顯示結果並進行驗證。

這是我用來以類似的方式轉換16位RAW圖像(灰度)的代碼。我在顯示之前重新標準化了圖像。

framenp = np.fromstring(framestr, dtype=np.uint16).reshape((1024,1280)) 
#renormalizing to float 
framenp = (framenp*1./framenp.max()) 
framenp.dtype = np.float 
cv2.imshow('frame', cv2.resize(framenp, (640,480))) 
相關問題