我正在尝试调试OpenCV.js遇到的问题。我正在尝试创建一个简单的寻圈功能,但是我的视频供稿正在 Canvas 中显示。我将其简化为显示问题的最小集合。
没有意义的是,我创建了一个新的空矩阵并显示它,并且看到了我的视频提要。
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);
}
}
最佳答案
很有可能在存储区中创建了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/