OpenCV.jsを使って、ブラウザに表示されている動画をコマ送りします。
OpenCV.jsのインストール
次のコマンドを使用して、OpenCV.jsのバージョン4.3.0をインストールします。OpenCV.jsの使い方については「Getting Started with Videos」を参照します。
C:\Users\xx>curl https://docs.opencv.org/4.3.0/opencv.js -o opencv.js
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 7890k 100 7890k 0 0 9630k 0 --:--:-- --:--:-- --:--:-- 9633k
コマ送り動画アプリの作成
OpenCVを使って動画をコマ送りするコマ送り動画アプリ「video.html」を作成します。
- 11行目で動画ファイル「TOPSECRET.mp4」を設定します。
- 35行目のstartメソッドで、動画ファイル「TOPSECRET.mp4」の再生を開始します。
- 51行目の一定時間ごとに呼び出されるprocessVideoメソッドで、動画フレームごとの処理を行います。
video.html
<!doctype html>
<html>
<head>
<title>OpenCV Video Examples - Video</title>
<link href="app.css" rel="stylesheet">
</head>
<body>
<h1>OpenCV Video</h1>
<video id="video" src="TOPSECRET.mp4" muted width="320" height="240"></video>
<canvas id="canvasOutput" width="320" height="240"></canvas>
<script async src="opencv.js" type="text/javascript" onload="onCvLoaded();"></script>
<script>
function onCvLoaded() {
console.log('cv', cv);
cv.onRuntimeInitialized = onReady;
}
const video = document.getElementById('video');
const actionBtn = document.getElementById('actionBtn');
const FPS = 30;
let stream;
let streaming = false;
function onReady() {
console.log('ready');
let src;
let dst;
let cap;
video.controls = true;
video.addEventListener('play', start);
video.addEventListener('pause', stop);
video.addEventListener('ended', stop);
function start() {
console.log('playing...');
streaming = true;
const width = video.width;
const height = video.height;
src = new cv.Mat(height, width, cv.CV_8UC4);
dst = new cv.Mat(height, width, cv.CV_8UC1);
cap = new cv.VideoCapture(video);
setTimeout(processVideo, 0);
}
function stop() {
console.log('paused or ended');
streaming = false;
}
function processVideo() {
if (!streaming) {
src.delete();
dst.delete();
return;
}
const begin = Date.now();
cap.read(src)
cv.cvtColor(src, dst, cv.COLOR_RGBA2GRAY);
cv.imshow('canvasOutput', dst);
//const delay = 1000 / (FPS * 1) - (Date.now() - begin);
const delay = 1000 / (1) - (Date.now() - begin);
setTimeout(processVideo, delay);
}
}
</script>
</body>
</html>
コマ送り動画アプリの実行
「http://localhost//opencvvideo/video.html」をアクセスして、プレーヤーの再生ボタンをクリックします。プレーヤーの横にコマ送りの動画が再生されます。