OpenCV Python QueryFrame函数会导致内存泄漏。

3

我正在使用 OpenCV 2.2.0Python 接口。以下代码可以正确地从视频文件中提取帧:

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”,但并没有解决问题。在这个特定函数中,Python封装OpenCV存在错误吗?

谢谢。

1个回答

1
你应该在程序一开始就为两个图像分配内存: imageL = cv.CreateImageHeader(cv.GetSize(frameL), frameL.depth, frameL.channels) imageR = cv.CreateImageHeader(cv.GetSize(frameR), frameR.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)

感谢您的回复。然而,如果您查看原始代码,我只创建了一次图像数据(imageL/imageR)。我也尝试了您的版本。内存泄漏问题仍然存在;这就是为什么我怀疑QueryFrame函数会泄漏内存的原因。 - Chang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接