MilestonePSToolsで静止画を自動的に取得する

この記事は約5分で読めます。

本ブログの記事「MilestonePSToolsを使ってみる」で紹介した、MIP SDK用のラッパーとして動作するWindows PowerShell用モジュールを使用してカメラの撮影している静止画を取得する方法を説明します。

監視カメラシステムを導入した際には、それぞれのカメラがどの位置にどの方向を向いて設置されているかを確認、証明するためにそれぞれのカメラの静止画を取得し、保存しておきます。

この画像はシステム納入時の納入図書に必ず含まれる重要な情報です。カメラが故障し、設置しなおす場合や、カメラに何かがぶつかって方向が変わったりした際に元の方向にカメラを戻す際に、納入図書に含まれるこの画像を見て、正しい方向にカメラを設定する場合に役立ちます。

どのVMS(Video Management Softwear)も、静止画を取得、保存する機能を持っており、各カメラの静止画を取得することが可能です。XProtectも当然この機能を有しています。下図はXProtectのSmart ClientにてCreate snapshotを使用している例です、右下のフロッピーディスクのアイコンをクリックするとその時点の静止画が保存されます。

このようなVMSの機能を使用して、静止画を取得することが可能です。しかしながら大規模な監視カメラシステムにおいては一つのシステムで数百台のカメラを収容する場合も多くあります。そのような場合において、マウスのワンクリックで静止画を保存できる機能があってもそれぞれのカメラを表示し、アイコンをクリックする作業を数百回行わなければなりません。

Get-VmsCameraReportコマンドレットによる静止画の取得

ブログ「MilestonePSToolsを使ってみる」でも説明した「Get-VmsCameraReport」コマンドレットにはパラメータ「IncludeSnapshots」があります。このコマンドを使用すればカメラの静止画を取得することが可能です。

Get-VmsCameraReportにより取り込んだSnapShotのデータはWindows .NETのSystem.Drawingオブジェクト1の型を継承しています。System.DrawingオブジェクトはSaveメソッド2をメンバーとして持ち、Saveメソッドを使用してファイルに画像を保存することが可能です。

本記事では、この「Get-VmsCameraReport」コマンドレットを使って自動的に複数のカメラの静止画を取得するPowerShellスクリプトについて説明します。

スクリプトとその説明

下記が本記事で説明するスクリプトです。

本記事中で紹介するスクリプトは試験用に作成したものです、実際にご使用される場合は手元の環境で十分に検証してから使われることをお勧めします。このスクリプトにより発生した障害については一切の責任を弊社は負いません。

Connect-ManagementServer -ShowDialog -AcceptEula             #Management Serverに接続
Get-VmsCameraReport -IncludeSnapshots |                      #スナップショットデータ付きでReportを取得
ForEach-object{                                              #1カメラずつ処理
  If ($_.SnapShot.equals){ 
    $Filename = "C:\Work\PowerShell\" + $_.name + ".jpg"     #XProtect内のカメラ名を取得
    $_.SnapShot.Save( $Filename, [System.Drawing.Imaging.ImageFormat]::Jpeg)   #Saveメソッドで保存
  } 
} 
Disconnect-ManagementServer                                  #Management Serverとの接続を終了

このスクリプトでは1行目でXProtectのManagement Serverに接続し、2行目の「-IncludeSnapshots」パラメータ付きで「Get-VmsCameraReport」コマンドレットを実行し、全カメラの静止画を取得します。

ForEach-Objectコマンドレット3により3行目から8行目の処理をカメラごとに繰り返します。すなわち、1カメラずつSnapShot画像が含まれていたら(4行目のIF文)、XProtect内でのカメラ名を含んだファイル名の変数「$Filename」を作成し(5行目)、SaveメソッドでJpegフォーマットでファイル名「$Filename」のファイルに保存します。

最後の行でManagement Serverとの接続を終了します。

なお、「Connect-ManagementServer」、「GET-VmsCameraReport」コマンドレットの詳細、および、MilestonePSToolsの実行環境、インストールについてはブログ記事「MilestonePSToolsを使ってみる」をご参照ください。

動作の様子

上記のスクリプトによる静止画の取得時の動画をご覧ください。

ちなみにここで使用している動画はすべてStableFPSを使用して作成しています。StableFPS用動画の作成方法はブログ記事「StableFPS用動画を作成する」をご参照ください。

YouTube MIC Associatesチャンネル

本記事と連動した動画をYouTube MIC Associatesチャンネルにアップロードしています。この記事と合わせて閲覧するとより理解が深まると思います。

字幕を表示してご覧ください。

00:00動画の概要説明
00:45対象システムの紹介
00:55スクリプトの概要と実行
01:42生成された静止画の確認
  1. PowerShell で扱う変数等の対象物は単なる文字列、数値ではなく「オブジェクト」と呼ばれる階層構造を持
    つ情報の塊です。ここで説明するSnapShotデータはSystem.Drawingオブジェクトの型を持ち、System.Drawingオブジェクトが持つ性質を継承しています。ここで説明するオブジェクトの詳細についてはMicrosoft社のPowerShellの説明ページ「第 3 章 – オブジェクト、プロパティ、およびメソッドの検出」に説明しています。 ↩︎
  2. PowerShellで扱うオブジェクトは当該オブジェクト毎にオブジェクトの属性情報に相当する「プロパティ」とオブジェクトに対する実行可能なアクションに相当する「メソッド」が用意されています。ここで説明する「Saveメソッド」はSystem.Drawingオブジェクトの型を持つSnapShotデータをファイルに保存するためのメソッドです。オブジェクトと同様に「プロパティ」と「メソッド」についてもMicrosoft社のPowerShellの説明ページ「第 3 章 – オブジェクト、プロパティ、およびメソッドの検出」に説明しています。 ↩︎
  3. 「ForEach-Objectコマンドレット」は対象となるオブジェクトの要素繰り返し同一の処理を行う、コマンドレットです。詳細はMicrosoft社のPowerShellのリファレンスページ「ForEach-Object」に説明しています。 ↩︎