我正在尝试调试OpenCV.js遇到的问题。我正在尝试创建一个简单的寻圈功能,但是我的视频供稿正在画布中显示。我将其简化为显示问题的最小集合。
没有意义的是,我创建了一个新的空矩阵并显示它,并且看到了我的视频提要。
scrMat
中,将srcMat
转换为灰度grayMat
,然后调用HoughCircles
来检测圆圈从grayMat
到circlesMat
。displayMat
并显示它。displayMat
。以某种方式填充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);
}
}
答案 0 :(得分:1)
很可能displayMat
是在用HoughCircles()
或其他方式完成某些图像处理的内存位置中创建的。该内存已释放,可用于在其中分配新对象,但是释放内存或新建Mat
都不能清除该内存块。
因此,只需先清理displayMat
,因为它是代替先前操作留下的一些“垃圾”而构造的,或者使用cv.Mat.zeros()
来构造displayMat
({{1} }用零填充整个新的矩阵缓冲区。
zeros()