OpenCV JavaScript を使用してビデオをキャプチャして再生する

Ammar Ali 2023年10月12日
  1. OpenCV JavaScript を使用してカメラからビデオをキャプチャして再生する
  2. OpenCV JavaScript を使用して、ファイルからビデオをキャプチャして再生する
OpenCV JavaScript を使用してビデオをキャプチャして再生する

このチュートリアルでは、カメラからビデオをキャプチャし、OpenCV JavaScript を使用して Web ページに表示する方法について説明します。

OpenCV JavaScript を使用してカメラからビデオをキャプチャして再生する

WebRTC、HTML の canvas および video 要素を使用して、カメラからビデオをキャプチャできます。 WebRTC は、カメラやマイクとのリアルタイム通信などのリアルタイム通信アプリケーションで使用されます。

JavaScript で WebRTCnavigator.mediaDevices.getUserMedia メソッドを使用して、カメラからビデオをキャプチャできます。

メソッドの最初の引数は、HTML の <video> タグを使用して作成できる HTML video 要素であり、その iddocument.getElementById() 関数を使用して video 要素を取得できます。 JavaScript。

document.getElementById() 関数の最初の引数は、ビデオ、オーディオ、またはビデオの両方の要素を取得するために使用されます。 navigator.mediaDevices.getUserMedia メソッドの 2 番目の引数は、video 要素であるストリームのソースを設定するために使用されます。

3 番目の引数は、キャプチャ プロセス中に発生したエラーを示します。 <video> タグ内でビデオの高さと幅を指定できます。

autoplay プロパティを使用してビデオを再生し、muted プロパティを使用してミュートすることもできます。 たとえば、カメラからビデオをキャプチャして、Web ページで再生してみましょう。 以下のコードを参照してください。

HTML コード:

<!DOCTYPE html>
<html lang="en">

<head>
    <title>OpenCV JavaScript</title>
    <script defer src="script.js"></script>
    <style>
        body {
            margin: 0;
            padding: 0;
            width: 100vw;
            height: 100vh;
            justify-content: center;
            padding-left: 5vw;
        }
    </style>
</head>

<body>
    <h1>Input Video</h1>
    <video id="video" width="300" height="200" autoplay muted></video>
</body>

</html>

JavaScript コード:

const Source_video = document.getElementById('video')

function startSource_Video() {
  navigator.getUserMedia(
      {video: {}}, stream => Source_video.srcObject = stream,
      err => console.error(err))
}

startSource_Video()

上記のコードを実行するには、HTML コードを test.html のような .html ファイルに保存し、JavaScript コードを script.js のような JavaScript ファイルに保存する必要があります。

defer 属性とともに <script> タグを使用して .html ファイルのヘッダー内に script.js ファイルを含める必要があります。これにより、スクリプト ファイルが他のコンテンツよりも先にロードされるようになります。

ビデオで OpenCV 関数を使用して、要件に従ってビデオを処理できるようになりました。 たとえば、カラー ビデオをグレースケール ビデオに変換できます。

ビデオをグレースケールに変換するには、入力ビデオと出力ビデオを格納するタイプ cv.Mat の 2つの変数を作成する必要があります。 cv.Mat() 関数内で 3つの引数を渡す必要があります。

1 番目と 2 番目の引数は入力ビデオの高さと幅で、3 番目は画像の種類です。

ビデオは多くの画像またはフレームで構成されていることがわかっています。ビデオをグレースケールに変換するには、各フレームを 1つずつ読み取り、cv.cvtColor() 関数を使用してグレースケールに変換する必要があります。

次に、OpenCV の cv.imshow() 関数を使用して、HTML の canvas 要素内に表示します。 ビデオをキャプチャするには、OpenCV の cv.VideoCapture() 関数を使用できます。

ビデオをキャプチャするには、関数内で video 要素またはその id を渡す必要があります。 次に、ビデオからフレームを取得するために、ビデオが保存されている変数で read() 関数を使用できます。

その後、cv.cvtColor() 関数内でフレーム、宛先変数、および色変換パラメータを渡して、フレームをグレースケールに変換できます。

cv.imshow() 関数を使用してフレームを 1つずつ表示できます。関数内で canvas 要素またはその id と、表示したい画像またはフレームを含む変数を渡す必要があります。 ウェブページで。

setTimeout() 関数を使用して各フレームを個別に処理するには、ミリ秒の遅延を追加する必要があります。 遅延値は、ビデオのフレーム数によって異なります。 たとえば、30 FPS ビデオの場合、ミリ秒単位の遅延は (1000/30 - process_time) と等しくなります。

処理時間は、各フレームをグレースケールに変換するのにかかる時間と同じです。この時間は、現在の時間を返す Date.now() 関数を使用して取得できます。この関数は、画像が変換される前後に使用できます。 処理されます。

したがって、それらの差は必要な遅延に等しくなります。 たとえば、カメラからのビデオをキャプチャして、OpenCV JavaScript を使用してグレースケールに変換してみましょう。

この例では、この リンク からダウンロードできる script タグを使用して、opencv.js ファイルを HTML ファイルにリンクする必要もあります。 以下のコードを参照してください。

HTML コード:

<!DOCTYPE html>
<html lang="en">

<head>
    <title>OpenCV JavaScript</title>
    <script defer src="opencv.js"></script>
    <script defer src="script.js"></script>
    <style>
        body {
            margin: 0;
            padding: 0;
            width: 100vw;
            height: 100vh;
            justify-content: center;
            padding-left: 5vw;
        }
    </style>
</head>

<body>
    <h1>Input Video</h1>
    <video id="video" width="300" height="200" autoplay muted></video>
    <div>
        <h1>Output Video</h1>
    <canvas id="canvasOutput" width="300" height="100"></canvas>
</div>
</body>

</html>

JavaScript コード:

const Source_video = document.getElementById('video')
let canvas = document.getElementById('canvasOutput')


function startSource_Video() {
  navigator.getUserMedia(
      {video: {}}, stream => Source_video.srcObject = stream,
      err => console.error(err))
}

startSource_Video()

cv['onRuntimeInitialized'] = () => {
  let srcImage =
      new cv.Mat(Source_video.height, Source_video.width, cv.CV_8UC4);
  let dstImage =
      new cv.Mat(Source_video.height, Source_video.width, cv.CV_8UC1);
  let cap = new cv.VideoCapture(Source_video);

  const FPS = 30;
  function processSource_Video() {
    let begin_delay = Date.now();
    cap.read(srcImage);
    cv.cvtColor(srcImage, dstImage, cv.COLOR_RGBA2GRAY);
    cv.imshow(canvas, dstImage);
    let delay = 1000 / FPS - (Date.now() - begin_delay);
    setTimeout(processSource_Video, delay);
  };
  setTimeout(processSource_Video, 0);
};

スクリプト ファイル script.js および opencv.js.html ファイルが同じディレクトリにあることを確認してから、.html ファイルを Web ブラウザで開きます。

上記のコードは、コンピューターのカメラからビデオをキャプチャします。カメラが使用できない場合は、Web ブラウザーのコンソールにエラーが表示されます。

OpenCV JavaScript を使用して、ファイルからビデオをキャプチャして再生する

上記のセクションでは、カメラからビデオをキャプチャして Web ページに表示しましたが、ファイルからビデオを読み取り、OpenCV JavaScript で処理することもできます。

たとえば、フォルダーから mp4 ビデオを読み取り、グレースケールに変換してから、Web ページに表示できます。 上記のセクションで使用したのと同じコードを使用できます。

カメラからビデオを取得するために使用される script.js ファイルから関数を削除するだけです。 次に、video.mp4 のような名前と拡張子とともにビデオ ファイルのパスを指定する <video> タグ内にソースを追加します。

残りのコードは同じである必要があります。 以下のコードを参照してください。

HTML コード:

<!DOCTYPE html>
<html lang="en">

<head>
    <title>OpenCV JavaScript</title>
    <script defer src="opencv.js"></script>
    <script defer src="script.js"></script>
    <style>
        body {
            margin: 0;
            padding: 0;
            width: 100vw;
            height: 100vh;
            justify-content: center;
            padding-left: 5vw;
        }
    </style>
</head>

<body>
    <h1>Input Video</h1>
    <video src="bon_fire_dog_2.mp4" id="video" width="300" height="200" autoplay muted></video>
    <div>
        <h1>Output Video</h1>
        <canvas id="canvasOutput" width="300" height="100"></canvas>
    </div>
</body>

</html>

JavaScript コード:

const Source_video = document.getElementById('video')
let canvas = document.getElementById('canvasOutput')

cv['onRuntimeInitialized'] = () => {
  let srcImage =
      new cv.Mat(Source_video.height, Source_video.width, cv.CV_8UC4);
  let dstImage =
      new cv.Mat(Source_video.height, Source_video.width, cv.CV_8UC1);
  let cap = new cv.VideoCapture(Source_video);

  const FPS = 30;
  function processSource_Video() {
    let begin_delay = Date.now();

    cap.read(srcImage);
    cv.cvtColor(srcImage, dstImage, cv.COLOR_RGBA2GRAY);
    cv.imshow(canvas, dstImage);

    let delay = 1000 / FPS - (Date.now() - begin_delay);
    setTimeout(processSource_Video, delay);
  };
  setTimeout(processSource_Video, 0);
};

出力:

opencv javascript を使用してビデオをキャプチャおよび再生する - ファイルからビデオをキャプチャする

上記のコードを実行するには、HTML コードを test.html のような .html ファイルに保存し、JavaScript コードを script.js のような JavaScript ファイルに保存する必要があります。

<script> タグを使用して、HTML ファイルのヘッダー内に script.js ファイルと opencv.js ファイルを含める必要があります。

上記の HTML コードで defer 属性を使用して、スクリプト ファイルが他のコンテンツよりも先に読み込まれるようにしました。 <style> タグを使用して、CSS スタイルを Web ページに追加しました。

上記の JavaScript コードでは、onRuntimeInitialized 関数を OpenCV に使用して、opencv.js が使用前に初期化されるようにしています。

著者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook