在 Javascript 上使用 Opencv roi() 函数导致内存溢出
Memory overflowing by using roi() function Opencv on Javascript
我有一台带双镜头的相机,通过 USB 连接到我的电脑,我在 Javascript.
上使用 OpenCV 创建了立体 3D 视频
问题是,我遇到了一个名为 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);
};
昨天我解决了这个问题。
实际上,问题也在于这些代码行:
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。好消息是这解决了内存泄漏问题,而且效果很好。
我有一台带双镜头的相机,通过 USB 连接到我的电脑,我在 Javascript.
上使用 OpenCV 创建了立体 3D 视频问题是,我遇到了一个名为 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);
};
昨天我解决了这个问题。 实际上,问题也在于这些代码行:
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。好消息是这解决了内存泄漏问题,而且效果很好。