Утечка памяти при сохранении клонов экземпляра Mat в массив - PullRequest
0 голосов
/ 08 июля 2019

Я читаю видео и сохраняю клоны экземпляров Mat каждого кадра в массив, чтобы я мог воспроизвести его по требованию, а также проанализировать кадры.Как только я обработал видео и сохранил кадры в массиве - снимок памяти увеличивается с 150 МБ до 1000 МБ в JSArrayBufferData.

Я должен упомянуть, что я использую инфраструктуру внешнего интерфейса Vue.js для хранения массива вНаблюдаемые данные vue - это массив.

Я попытался удалить и установить каждый кадр в ноль, просто чтобы посмотреть, освободит ли это память, но, похоже, ничего не работает.

Возможно, он также имеетчто-то сделать из-за меня с помощью рекурсивного вызова функции https://jsfiddle.net/j93tmr6f/

    new Vue({
  el: "#app",
  data: {
   videoFrames: [],
   videoFile: null,
   frame: null,
   videoCap: null,
  },
  methods: {
  videoEnded() {
  console.log('ended')
     this.streaming = false
      // show first frame from small frames array
      this.playFrame(this.videoFrames[11])
    },
    videoChanged: function(fieldName, file){
        this.videoFile = URL.createObjectURL(file[0])
      this.$refs.videoRef.src = this.videoFile
      this.loadFrames()
    },
    loadFrames() {
      this.isProcessing = true
            this.streaming = true
      this.videoFrames = []
      const videoRef = this.$refs.videoRef
      const [height, width] = [720, 1280]
      this.$refs.canvasOutput.width = width / 2
      this.$refs.canvasOutput.height = height / 2
      videoRef.width = width
      videoRef.height = height

      this.videoCap = new cv.VideoCapture(videoRef)
      videoRef.play()

      setTimeout(this.scanFrames, 0)

  },
  scanFrames() {
    if (!this.streaming) return 
      try {
        const [height, width] = [720, 1280]

        this.frame = new cv.Mat(height, width, cv.CV_8UC4)
        let begin = Date.now()
        this.videoCap.read(this.frame)
        this.videoFrames.push(this.frame.clone())
        cv.imshow('canvasOutput', this.frame)
        // remove the processed frame from memory.
        this.frame.delete()

        // schedule the next one.
        let delay = 1000 / this.FPS - (Date.now() - begin)
        setTimeout(this.scanFrames, delay)
      } catch (err) {
        console.log(err)
      }
    },
    }
})

более или менее это структура кода.Он не работает на скрипке из-за ошибок памяти.

Я хотел бы освободить память из хрома, потому что каждый раз, когда я сейчас анализирую видео, она может занимать до 9 ГБ в объеме памяти.Как вы можете себе представить, это не желаемый результат.

...