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

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

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

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

    某种程度上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);
      }
    }
    

    最佳答案

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

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

    let displayMat = cv.Mat.zeros(height, width, cv.CV_8UC1);
    

    关于javascript - OpenCV.js的副作用:视频在没有请求的情况下被插入新的空白矩阵,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55955672/

    10-12 21:38