AI やコグニティブエンジンで画像認識機能を使ったり(特にそのためのデータ学習を行おうと)すると、大量の画像データが必要になります。その画像データが手元にある場合はそれらを使えばいいのですが、充分な画像がない場合にどうするか? という問題があります。

ネットから画像検索して見つかるようなものであればそれも方法の1つですが、学習に使えるようなシーンが映った動画があれば、その動画から静止画像を切り取って使う、という方法もあります。この処理をNode.js のプログラムで自動化する方法を紹介します。

まず、このような動画から静止画を切り出すには ffmpeg を使うと便利です。ffmpeg はクロスプラットフォームで動くフリーな動画処理ソフトで、コーデックやライブラリ等も含んでいます。Node.js からであれば fluent-ffmpeg ライブラリをインストールすることで、この ffmpeg のネイティブ機能が使えるようになります(なので ffmpeg をインストールした上で、fluent-ffmpeg を使う必要があります。ちなみに Ubuntu 16.04 では ffmpeg がデフォルトで導入されています)
2017102000


というわけで、まずはライブラリを準備します。以下のサンプルソースで使う path ライブラリと合わせてこんな感じ:
$ npm install path fluent-ffmpeg

そして以下のようなサンプルコードを用意します:
var ffmpeg = require( 'fluent-ffmpeg' );
var path = require( 'path' );

var mpegfile = './abc.mp4';  //. 動画ファイル

var command = ffmpeg( mpegfile );

command.on( 'end', () => {
  console.log( 'ok' );
}).screenshots({
  count: 4,                               //. 20%, 40%, 60%, 80% のタイミングで静止画を取得する
  folder: path.join( __dirname, 'tmp' );  //. ./tmp/ フォルダに静止画を出力
  filename: 'abc-%i:%s.png',              //. ファイル名は abc-(インデックス番号):(秒).png
  size: '320x?'                           //. 画像サイズは横幅 320 px で、縦を可変(同一縮尺)にする
});


このコードでは実行結果の静止画像を ./tmp フォルダ以下に作成するよう指定しています。なので、まずこのフォルダを作成しておきます:
$ mkdir tmp

そして上記のコードを Node.js で実行。成功すると tmp/ 以下に abc-****.png という画像ファイルが4枚出力されます。


上記例では静止画像を取得するタイミングを同間隔で4枚という指定をしましたが、timemarks を指定することで何秒後、という指定も可能です:
      :
  timemarks: [ 0.5, 1, 2 ],             //. 0.5秒後、1秒後、2秒後に切り取り
      :