2011-03-15 139 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