Я пытаюсь отладить проблему, возникающую у меня с OpenCV.js. Я пытаюсь создать простую функцию поиска круга, но мой видеопоток отображается на моем холсте. Я свел его к наименьшему набору, который показывает проблему.
Что не имеет смысла, так это то, что я создаю новую пустую матрицу и отображаю ее, и вижу в ней мой видеопоток.
- Я начну с типичного способа обнаружения кругов: потоковое видео в матрицу
scrMat
, преобразование srcMat
в оттенки серого grayMat
, а затем вызов HoughCircles
для обнаружения кругов от grayMat
до circlesMat
.
- Затем независимо создаю новый
displayMat
и отображаю его.
- Я вижу вывод ниже, где правая сторона -
displayMat
.
![enter image description here](https://i.stack.imgur.com/IiQhX.jpg)
Каким-то образом 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);
}
}