OpenCV 4.11.0
开源计算机视觉
|
通常,我们需要使用摄像头捕捉实时流。在 OpenCV.js 中,我们使用 WebRTC 和 HTML canvas 元素来实现这一点。让我们从摄像头(内置或 USB)捕捉视频,将其转换为灰度视频并显示它。
要捕捉视频,您需要向网页添加一些 HTML 元素:
首先,我们使用 WebRTC 的 `navigator.mediaDevices.getUserMedia` 获取媒体流。
let video = document.getElementById("videoInput"); // video 是 video 标签的 id
navigator.mediaDevices.getUserMedia({ video: true, audio: false })
.then(function(stream) {
video.srcObject = stream;
video.play();
.catch(function(err) {
console.log("An error occurred! " + err);
现在,浏览器获取了摄像头流。然后,我们使用 Canvas 2D API 的 `CanvasRenderingContext2D.drawImage()` 方法将视频绘制到 canvas 上。最后,我们可以使用 图像入门 中的方法来读取和显示 canvas 中的图像。对于播放视频,应每隔 `delay` 毫秒执行一次 cv.imshow()。我们推荐使用 `setTimeout()` 方法。如果视频是 30fps,则延迟毫秒数应为 (1000/30 - processing_time)。
let canvasFrame = document.getElementById("canvasFrame"); // canvasFrame 是 <canvas> 的 id
let context = canvasFrame.getContext("2d");
let src = new cv.Mat(height, width, cv.CV_8UC4);
let dst = new cv.Mat(height, width, cv.CV_8UC1);
const FPS = 30;
function processVideo() {
let begin = Date.now();
context.drawImage(video, 0, 0, width, height);
src.data.set(context.getImageData(0, 0, width, height).data);
cv.cvtColor(src, dst, cv.COLOR_RGBA2GRAY);
cv.imshow("canvasOutput", dst); // canvasOutput 是另一个 <canvas> 的 id;
let delay = 1000/FPS - (Date.now() - begin);
setTimeout(processVideo, delay);
setTimeout(processVideo, 0);
OpenCV.js 使用上述方法实现了cv.VideoCapture (videoSource)。您无需手动添加隐藏的 canvas 元素。
videoSource | 视频 id 或元素。 |
我们使用read (image)来获取视频的一帧。出于性能原因,图像应使用 cv.CV_8UC4 类型构造,大小与视频相同。
image | cv.CV_8UC4 类型且大小与视频相同的图像。 |
上面播放视频的代码可以简化为如下:
let src = new cv.Mat(height, width, cv.CV_8UC4);
let dst = new cv.Mat(height, width, cv.CV_8UC1);
let cap = new cv.VideoCapture(videoSource);
const FPS = 30;
function processVideo() {
let begin = Date.now();
cap.read(src);
cv.cvtColor(src, dst, cv.COLOR_RGBA2GRAY);
cv.imshow("canvasOutput", dst);
let delay = 1000/FPS - (Date.now() - begin);
setTimeout(processVideo, delay);
setTimeout(processVideo, 0);