2011-03-15 137 views
3

我使用Python接口爲OpenCV 2.2.0。以下代碼可以正確地從視頻文件中抓取幀:OpenCV蟒蛇QueryFrame功能泄漏內存

for f in range(1, frameCount): 
    # grab the left and right frames 
    frameL = cv.QueryFrame(videoL) 
    frameR = cv.QueryFrame(videoR) 
    # create the image for the first frame 
    if f==1: 
     imageL = cv.CreateImage(cv.GetSize(frameL), frameL.depth, frameL.channels) 
     imageR = cv.CreateImage(cv.GetSize(frameR), frameR.depth, frameR.channels) 
    # update the images 
    cv.Copy(frameL, imageL) 
    cv.Copy(frameR, imageR) 

但是,隨着我處理更多視頻幀,內存消耗量不斷增加。根據OpenCV文檔,我們不需要釋放由cv.QueryFrame獲取的圖像數據的內存。這是否正確?我嘗試過「del frameL」和「del frameR」,但它沒有解決問題。在這個特定函數中,OpenCV的Python包裝中是否存在一個錯誤?

謝謝。

回答

1

你應該兩個圖像一次分配內存: imageL = cv.CreateImageHeader(cv.GetSize(frameL),frameL.depth,frameL.channels) 成像= cv.CreateImageHeader(cv.GetSize(成幀器),成幀器.depth,frameR.channels)

然後開始你的循環,並設置數據:

cv.SetData(frameL, imageL) 
cv.SetData(frameR, imageR) 

所以像

for f in range(1, frameCount): 
    # grab the left and right frames 
    frameL = cv.QueryFrame(videoL) 
    frameR = cv.QueryFrame(videoR) 
    # create the image for the first frame 
    if f==1: 
     imageL = cv.CreateImageHeader(cv.GetSize(frameL), frameL.depth, frameL.channels) 
     imageR = cv.CreateImageHeader(cv.GetSize(frameR), frameR.depth, frameR.channels) 
    # update the images 
    cv.SetData(frameL, imageL) 
    cv.SetData(frameR, imageR) 
+0

感謝您的答覆。但是,如果您查看原始代碼,我只創建一次圖像數據(imageL/imageR)。我也試過你的版本。內存泄漏問題仍然存在;這就是爲什麼我懷疑QueryFrame函數泄漏內存。 – Chang 2011-03-16 20:56:52