opencv.js频繁读取导致内存不断增长,如何清理?

这个识别库原本是上传图片后再识别的,但项目需要调取摄像头,调取摄像头的话就势必要频繁抓取图像用于识别
不使用jsQR或zxing也是因为不支持同时多二维码识别
Barcode Detection API可以直接用视频流识别多二维码,但识别率低
只有这个库识别率高

使用的识别库

  • wechat-qrcode-ocr-wasm
getImgQRCodeInfo error RuntimeError: Aborted(). Build with -sASSERTIONS for more info.

at abort (VM3270 opencv.js:404:15)

at _abort (VM3270 opencv.js:5393:7)

at 00dfaa9e:0x4f03

at 00dfaa9e:0x1f8010

at 00dfaa9e:0x200365

at Mat.constructor$Mat (eval at new_ (VM3270 opencv.js:1:1), <anonymous>:10:10)

at Mat.eval (VM3270 opencv.js:4540:23)

at new Mat (eval at createNamedFunction (VM3270 opencv.js:1:1), <anonymous>:4:34)

at Module.matFromImageData (VM3270 opencv.js:6464:17)

at Module.imread (VM3270 opencv.js:6137:17)

// options.img我改成HTMLCanvasElement类型

const mat = openCV.imread(options.img);

const detector = new openCV.wechat_qrcode_WeChatQRCode(

"detect.prototxt",

"detect.caffemodel",

"sr.prototxt",

"sr.caffemodel"

);

const matVector = new openCV.MatVector();

const results = detector.detectAndDecode(mat, matVector);

// ...其他代码

// 原本index.ts中的Mat没有delete,我加了一个delete(...args: any): any;

// opencv官方的delete,释放内存

mat.delete()

matVector.delete()

opencv.js频繁读取导致内存不断增长,如何清理?


回答:

这个泄漏不知道是不是库内部的。我之前用 sharp 也会有类似的问题。

暂时没找到合理的解决方案。说一些暴力的吧

  1. node 我们当时起了多个服务,每个服务在处理完任务之后就重启。这样就能让内存较为稳定。
  2. web 的话对应的就是刷新页面。实现细节上可以考虑 iframe 之类的方法,便于刷新。

对了还有一个点,注意有没有 bloburl 没释放

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。

以上是 opencv.js频繁读取导致内存不断增长,如何清理? 的全部内容, 来源链接: utcz.com/p/933888.html

回到顶部