Функция OpenCV Python QueryFrame приводит к утечке памяти - PullRequest
3 голосов
/ 16 марта 2011

Я использую интерфейс 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", но это не решило проблему. Есть ли ошибка в оболочке Python для OpenCV в этой конкретной функции?

Спасибо.

1 Ответ

1 голос
/ 16 марта 2011

Вы должны выделить память для обоих изображений один раз: 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...