OpenCV.js的副作用:视频在没有请求的情况下被推入新的空白矩阵

时间:2019-05-02 15:24:59

标签: javascript opencv

我正在尝试调试OpenCV.js遇到的问题。我正在尝试创建一个简单的寻圈功能,但是我的视频供稿正在画布中显示。我将其简化为显示问题的最小集合。

没有意义的是,我创建了一个新的空矩阵并显示它,并且看到了我的视频提要。

  1. 我从检测圆圈的典型方法开始:将视频流传输到矩阵scrMat中,将srcMat转换为灰度grayMat,然后调用HoughCircles来检测圆圈从grayMatcirclesMat
  2. 然后,我独立创建一个新的displayMat并显示它。
  3. 我看到下面的输出,其中右侧为displayMat

enter image description here

以某种方式填充displayMat。如果我在HoughCircles行中注释掉,效果将消失。

这是怎么回事?

const cv = require('opencv.js');  // v1.2.1

const video = document.getElementById('video');
const width = 300;
const height = 225;
const FPS = 30;
let stream;

let srcMat = new cv.Mat(height, width, cv.CV_8UC4);
let grayMat = new cv.Mat(height, width, cv.CV_8UC1);
let circlesMat = new cv.Mat();

const cap = new cv.VideoCapture(video);

export default function capture() {
  navigator.mediaDevices.getUserMedia({ video: true, audio: false })
  .then(_stream => {
      stream = _stream;
      video.srcObject = stream;
      video.play();
      setTimeout(processVideo, 0)
  })
  .catch(err => console.log(`An error occurred: ${err}`));

  function processVideo () {
    const begin = Date.now();

    // these next three lines shouldn't affect displayMat
    cap.read(srcMat);
    cv.cvtColor(srcMat, grayMat, cv.COLOR_RGBA2GRAY);
    // if this line is commented out, the effect goes away
    cv.HoughCircles(grayMat, circlesMat, cv.HOUGH_GRADIENT, 1, 45, 75, 40, 0, 0);

    // this ought to simply create a new matrix and draw it
    let displayMat = new cv.Mat(height, width, cv.CV_8UC1);
    cv.imshow('canvasOutput', displayMat);

    const delay = 1000/FPS - (Date.now() - begin);
    setTimeout(processVideo, delay);
  }
}

1 个答案:

答案 0 :(得分:1)

很可能displayMat是在用HoughCircles()或其他方式完成某些图像处理的内存位置中创建的。该内存已释放,可用于在其中分配新对象,但是释放内存或新建Mat都不能清除该内存块。

因此,只需先清理displayMat,因为它是代替先前操作留下的一些“垃圾”而构造的,或者使用cv.Mat.zeros()来构造displayMat({{1} }用零填充整个新的矩阵缓冲区。

zeros()