OpenCV Python QueryFrame函数内存泄漏

3 投票
1 回答
1094 浏览
提问于 2025-04-16 13:46

我正在使用 Python 接口来操作 OpenCV 2.2.0。下面的代码可以正确地从视频文件中抓取帧:

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 接口在这个特定功能上有bug呢?

谢谢。

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)

撰写回答