Переполнение памяти при использовании функции roi () Opencv на Javascript - PullRequest
0 голосов
/ 13 января 2019

У меня есть камера с двойным объективом, подключенным через USB к компьютеру, и я создал анаглифическое 3D-видео с использованием OpenCV на Javascript.

Проблема в том, что я обнаружил ошибку, которая называется OutOfMemory. Я проверил утечку памяти из моих переменных, которые находятся в цикле, и я мог видеть, что все остаются с одним и тем же указателем, кроме одного, здесь код:

Мне пришлось отладить, и я понимаю, что эта переменная меняла свой указатель каждый раз, когда цикл начинался снова:

CorrIzq = dstIzq.roi(RectImgIzq);

Итак, я прокомментировал и передал его непосредственно функции addWeighted(), но теперь он назначил новый указатель на dstEstereoscopico (это переменная Mat). Итак, я поставил его как const и, похоже, он имеет один и тот же указатель в каждом цикле, но все равно переполнение памяти.

Можете ли вы помочь мне, пожалуйста?

Знаете ли вы, может ли это быть ошибкой или, возможно, я неправильно ее использую?

function processVideo() {
    begin = Date.now();
    try {
      //dstEstereoscopico = new cv.Mat(videoEstereoscopico.height - 15, videoEstereoscopico.width - 20, cv.CV_8UC1);
      console.log(dstEstereoscopico);

      //Dibujando en el objeto Canvas
      capIzq.read(srcIzq);
      capDer.read(srcDer);
      console.log(capIzq);


      //Obteniendo canales RGB
      cv.split(srcIzq, Array_rgbValores);
      Array_rgbValores.set(1, cv.Mat.zeros(canvasFrameIzq.height, canvasFrameIzq.width, cv.CV_8UC1));
      Array_rgbValores.set(2, cv.Mat.zeros(canvasFrameIzq.height, canvasFrameIzq.width, cv.CV_8UC1));
      cv.cvtColor(srcIzq, dstIzq, cv.COLOR_RGBA2GRAY);
      cv.merge(Array_rgbValores, dstIzq);

      //Aplicando corrección de posicionamiento
      //CorrIzq = dstIzq.roi(RectImgIzq);
      //console.log(CorrIzq);

      cv.split(srcDer, Array_rgbValores);
      Array_rgbValores.set(0, cv.Mat.zeros(canvasFrameIzq.height, canvasFrameIzq.width, cv.CV_8UC1));
      Array_rgbValores.set(1, cv.Mat.zeros(canvasFrameIzq.height, canvasFrameIzq.width, cv.CV_8UC1));
      cv.cvtColor(srcDer, dstDer, cv.COLOR_RGBA2GRAY);
      cv.merge(Array_rgbValores, dstDer);

      //CorrDer = dstDer.roi(RectImgDer);


      //corrDer = dstDer,
      cv.addWeighted(dstIzq.roi(RectImgIzq), 0.7, dstDer.roi(RectImgDer), 0.5, 1, dstEstereoscopico);
      contextDer.clearRect(0,0, canvasFrameDer.width, canvasFrameDer.height);
      contextIzq.clearRect(0,0, canvasFrameIzq.width, canvasFrameIzq.height);
      contextDestEste.clearRect(0,0, videoEstereoscopico.width, videoEstereoscopico.height);
      cv.imshow("videoEstereoscopico", dstEstereoscopico);
      // schedule next one.

      /*srcIzq.delete();
      srcDer.delete();
      dstIzq.delete();
      dstDer.delete();
      Array_rgbValores.delete();*/
      //dstEstereoscopico.delete();
      //dstEstereoscopico = [];

      //CorrIzq.delete();
      //CorrDer.delete();

      //console.log(performance.memory);
      //console.log("El contador es: " + contador++);
      //console.log("Tiempo transcurrido: " + (Date.now() - tiempoInicio)/1000 + " s");
      clearTimeout(id_SetProVid);
      delay = ((Date.now() - begin));
      id_SetProVid = setTimeout(processVideo, delay);

    } catch (err) {
      console.log("El error se ha cacheado");
      this.printError(err);
    }
  }
  setTimeout(processVideo, 0);
};

1 Ответ

0 голосов
/ 13 января 2019

Вчера я решил эту проблему. Собственно, проблема была тоже в следующих строках кода:

Array_rgbValores.set(1, cv.Mat.zeros(canvasFrameIzq.height, canvasFrameIzq.width, cv.CV_8UC1));
Array_rgbValores.set(2, cv.Mat.zeros(canvasFrameIzq.height, canvasFrameIzq.width, cv.CV_8UC1));

Я думаю, что это не правильное использование. Однако я изменяю их следующим образом:

R = Array_rgbValoresIzq.get(0);
G = new cv.Mat.zeros(videoIzq.height, videoIzq.width, cv.CV_8UC1);
B = new cv.Mat.zeros(videoIzq.height, videoIzq.width, cv.CV_8UC1);
A = Array_rgbValoresIzq.get(3);

Array_rgbBuffIzq.push_back(R);
Array_rgbBuffIzq.push_back(G);
Array_rgbBuffIzq.push_back(B);
Array_rgbBuffIzq.push_back(A);

Мне пришлось создать один новый MatVector и еще 4 Mats. Хорошая новость заключается в том, что это решило проблему утечки памяти, и она отлично работала.

...