2015/06/29 MsakoAPI プログラミングガイド ( 改訂第 5 版 ) この資料は Msako 4.1.1 MsakoAPI 1.8 以降に適応する Visual Studio のツールボックスに MsakoAPI を加える プログラムに MsakoTranceiver を組み込む Msako と接続する Msako の基本情報を取得する Msako のパラメータを取得 設定する 動体検知のイベントを処理する 動体検知の詳細データを取得する 動体検知を開始 停止する スナップショット画像を取得する 再構成する 再起動する 外部機器で発生した異常を通知する イベント番号一覧を取得する イベント情報を取得する イベント画像を取得する サンプルプログラムを実行する 1
Visual Studio のツールボックスに MsakoAPI を加える 新しい Windows フォームアプリケー ションプロジェクトを作成する ツールボックスの余白の部分で マ ウス右ボタンを押し アイテムの選 択 を選ぶ 2
ツールボックスアイテムの選択 にて 参照 ボタンを押し MsakoAPI の DLL ファイル MsakoAPI.dll を指定する すると 一覧に右のように追加される ツールボックスには MsakoTranceiver のアイコンが表示 される 3
プログラムに MsakoTranceiver を組み込む ツールボックスの MsakoTranceiver のアイコンをドラッグして フォー ムの上でドロップする MsakoTranceiver1 という名前のコ ンポーネントが作成されて フォー ムの下に表示される 4
メッセージハンドラをオーバーライ ドする Protected Overrides Sub WndProc(ByRef m As Message) MsakoTranceiver1.WndProc(m) MyBase.WndProc(m) End Sub C#.NET の場合 protected override void WndProc(ref Message m) { MsakoTranceiver1.WndProc(ref m); base.wndproc(ref m); } 5
Msako と接続する MsakoAPI を使う場合 先ず最初に Msako と接続しなければならない 接続する相手の Msako は特定の1つである ここで注意しておかなければならないのは 接続を試みる時点で システムには2つ以上の Msako が存在する場合もあるということである 1つのシステム内で複数のカメラがあった場合 それらを使用する Msako も複数個起動する Msako と接続するためには MsakoTranceiver クラスの Discover メソッドを使用する このメソッドは システム内にある Msako を探索する 次の例は ボタンコントロールを押したときにこのメソッドは呼ぶ例である ただし これは 1 例であり どのタイミングで Msako と接続するかは プログラマに任せられている Private Sub btndiscover_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btndiscover.click If MsakoTranceiver1.Discover() <> MT_RESULT.MT_SUCCESS Then MessageBox.Show("Fail Discover()") End Sub C#.NET の場合 private void btndiscover_click(object sender, EventArgs e) { if (MsakoTranceiver1.Discover()!= MT_RESULT.MT_SUCCESS) MessageBox.Show("Fail Discover()"); } 上の例のように引数なしで Discover メソッドを呼んだ場合 探索して発見した Msako のうち 1 番目の Msako に接続される 探索した結果 Msako が見つからない場合 このメソッドは MT_RESULT.MT_NOCONNECTION を返す 探索した結果いくつの Msako が見つかったかは PeerCount プロパティを調べればわかる 接続先の Msako を変更するためには SelectedIndex プロパティーを変更すればよい どのような順序で Msako が発見されるかは規則は無いが 発見したそれぞれの Msako のウィンドウハンドルが GetPeerAt メソッドによって取得できるので 取得したウィンドウハンドルを手がかりに相手の Msako を特定することが可能だ また 後述する基本情報取得用のメソッドを使ってそれぞれの Msako の画像の大きさなどを調べ上げることもできる 6
Msako の基本情報を取得する 接続している Msako について次の情報を得ることができる カメラ名 カメラ別名 撮影場所 カメラ識別番号 画像の横幅 画像の高さ 画像回転角 Msako の状態 処理時間 これらの情報を得るために 次のメソッドが用意されている GetDeviceName GetAlias GetLocation GetCameraId GetImageSize GetStatus 次の例は カメラ名を取得してメッセージボックスに表示する例である Dim name As String = String.Empty If MsakoTranceiver1.GetDeviceName(name) = MT_RESULT.MT_SUCCESS Then MessageBox.Show(name) Else MessageBox.Show("Fail GetDeviceName()") C#.NET の場合 string name = string.empty; if (MsakoTranceiver1.GetDeviceName(ref name) == MT_RESULT.MT_SUCCESS) MessageBox.Show(name); else MessageBox.Show("Fail GetDeviceName()"); 7
Msako のパラメータを取得 設定する 接続している Msako に設定されているパラメータの値を取得したり 変更することができる 対象となる パラメータは次の通りである 感度 (MP_SENSE_LEVEL) サンプル速度 (MP_FRAME_RATE) ブロックの大きさ (MP_BLOCK_SIZE) バッファ数 (MP_NUM_BUFFER) ターゲット数 (MP_NUM_TARGET) 閃光フィルタ (MP_FLASH_COMP) 頭部拡張補正 (MP_HEAD_COMP) ブロック結合度 (MP_BLOCK_COH) 警報レベル (MP_ALARM_LEVEL) 自動サンプル速度 (MP_AUTO_SPEED) これらのパラメータの値を取得するには GetParameter メソッドを 設定するには SetParameter メソッドを 使う 次の例は 感度を取得してメッセージボックスに表示する例である Dim pdata As MM_PARAM_DATA = New MM_PARAM_DATA() pdata.type = MM_PARAM_TYPE.MP_SENSE_LEVEL If MsakoTranceiver1.GetParameter(pdata) = MT_RESULT.MT_SUCCESS Then MessageBox.Show(pdata.param.int_value.ToString()) Else MessageBox.Show("Fail GetParameter()") C#.NET の場合 MM_PARAM_DATA pdata = new MM_PARAM_DATA(); pdata.type = MM_PARAM_TYPE.MP_SENSE_LEVEL; if (MsakoTranceiver1.GetParameter(ref pdata) == MT_RESULT.MT_SUCCESS) MessageBox.Show(pdata.param.int_value.ToString()); else MessageBox.Show("Fail GetParameter()"); 8
動体検知のイベントを処理する Msako が動体を検知したことは MsakoTranceiver のイベント 1 として通知される 従って プログラマは MsakoTranceiver のイベントハンドラーを作成することによって Msako が動体を検知したことに応じた処理を実施することができる MsakoTranceiver には次のイベント 1 がある Initialized Terminated Started Stoped EventStart EventEnd EventAlarm NoMotion MotionDetected Motion 2 Msako が起動した Msako が停止した動体検知を開始した動体検知を停止した動体検知のイベントが発生した動体検知のイベントが終了した動体検知のイベントが警告モードになった動きまセンサーが検知した動体検知フレームを検出した動体検知フレームの詳細データ これらのイベントについて イベントハンドラーを作成する方法は 通常の.NET アプリケーションと同じ要領である Visual Studio のフォームに表示されている MsakoTranceiver のインスタンスを選択し プロパティウィンドウに表示されたイベント名をダブルクリックすれば 自動的に空のイベントハンドラが作成される プログラマは 作製された空のイベントハンドラーに処理したい内容を書き足してゆく 次の例は MotionDetected に対するイベントハンドラである Private Sub MsakoTranceiver1_MotionDetected(ByVal sender As System.Object, ByVal e As MsakoAPI.MsakoEventArgs) Handles MsakoTranceiver1.MotionDetected MessageBox.Show(" 動体を検知しました ") End Sub C#.NET の場合 private void MsakoTranceiver1_MotionDetected(object sender, MsakoEventArgs e) { MessageBox.Show(" 動体を検知しました "); } 1 Msako の動体検知イベントと.NET のクラスのイベントは別のものであるので区別して理解すること 2 Motion イベントについては それ以外と区別して後の章で説明する 9
MsakoTranceiver1 という名前のコンポーネントを選択し プロパティーウィンドウのイベント MotionDetected をダブルクリックする すると コードウィンドウが開いて MsakoTranceiver1_MotionDetected という名前の空のイベントハンドラが作成される ここに 自分の処理を書き加えてゆく 10
動体検知の詳細データを取得する フレームごとに動体検知の過程で算出したデータを取得することができる これらのデータを取得するには あらかじめ MsakoTranceiver の Listen メソッドを使って接続している Msako にデータの配信を依頼しておく必要がある 検知したフレームの日時イベントが開始した日時イベント番号フレーム番号総移動ピクセル数認識されたターゲット数ターゲットごとの情報ターゲットの識別子ターゲットに含まれる移動ピクセル数ターゲットの重心の座標ターゲットの範囲ターゲットの色ターゲットのスポット領域 これらのデータは 前の章では説明しなかったが 前の章と同様に MsakoTranceiver の Motion イベントとして通知される したがって イベントハンドラの中で処理することも同様である ただし このイベントハンドラには MotionEventArgs という引数が渡される この MotionEventArgs 引数には MM_MOTION_DATA 型の構造体が含まれていて この構造体に上記の詳細データが記述されている 次の例は 1 番目のターゲットの重心の座標をフォーム上のテキストボックスに表示する例である Private Sub MsakoTranceiver1_Motion(ByVal sender As System.Object, ByVal e As MsakoAPI.MotionEventArgs) Handles MsakoTranceiver1.Motion textcx.text = e.mdata.target0.center_x.tostring() textcy.text = e.mdata.target0.center_y.tostring() End Sub C#.NET の場合 private void MsakoTranceiver1_Motion(object sender, MotionEventArgs e) { textcx.text = e.mdata.target0.center_x.tostring(); textcy.text = e.mdata.target0.center_y.tostring(); } 11
動体検知を開始 停止する Msako の動体検知を開始 停止するには MsakoTranceiver の Start メソッド Stop メソッドを使う これらのメソッドには タイムアウト時間の引数がある ここで指定した時間内に Msako が起動しなかった場合 このメソッドは MT_RESULT.MT_TIMEOUT を返す プログラマは それぞれのシステムに応じてこのタイムアウト時間を適宜設定する 次の例は フォーム上のボタンが押されると開始 停止する例で 開始に 3 秒 停止に 1 秒のタイムアウト時間を設定している Private Sub btnstart_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnstart.click If MsakoTranceiver1.Start(3000) <> MT_RESULT.MT_SUCCESS Then MessageBox.Show("Fail Start()") End Sub Private Sub btnstop_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles btnstop.click If MsakoTranceiver1.Stop(1000) <> MT_RESULT.MT_SUCCESS Then MessageBox.Show("Fail Stop()") End Sub C#.NET の場合 private void btnstart_click(object sender, EventArgs e) { if (MsakoTranceiver1.Start(3000)!= MT_RESULT.MT_SUCCESS) MessageBox.Show("Fail Start()"); } private void btnstop_click(object sender, EventArgs e) { if (MsakoTranceiver1.Stop(1000)!= MT_RESULT.MT_SUCCESS) MessageBox.Show("Fail Stop()"); } 12
スナップショット画像を取得する Msako の最新のスナップショット画像を取得するには MsakoTranceiver の GetSnapshot メソッドを使う このメソッドは 引数で指定した Bitmap オブジェクトに取得した画像を返す ただし Msako が停止している場合は 全体が黒い画像を返す 次の例は タイムアウト時間を 200 ミリ秒に設定してスナップショット画像を取得する例である Dim bmpsnapshot As Bitmap = Nothing If MsakoTranceiver1.GetSnapshot(bmpSnapshot, 200) <> MT_RESULT.MT_SUCCESS Then MessageBox.Show("Fail GetSnapshot()") C#.NET の場合 Bitmap bmpsnapshot = null; if (MsakoTranceiver1.GetSnapshot(ref bmpsnapshot, 200)!= MT_RESULT.MT_SUCCESS) MessageBox.Show("Fail GetSnapshot()"); 13
再構成する Msako の設定値を再度読み込ませるためには MsakoTranceiver の Configure メソッドを使う 次の例は タイムアウト時間を 2 秒に設定して再構成する例である If MsakoTranceiver1.Configure(2000) <> MT_RESULT.MT_SUCCESS Then MessageBox.Show("Fail Configure()") C#.NET の場合 if (MsakoTranceiver1.Configure(2000)!= MT_RESULT.MT_SUCCESS) MessageBox.Show("Fail Configure()"); 再起動する Msako の再起動するためには MsakoTranceiver の Reset メソッドを使う If MsakoTranceiver1.Reset() <> MT_RESULT.MT_SUCCESS Then MessageBox.Show("Fail Reset()") C#.NET の場合 if (MsakoTranceiver1.Reset()!= MT_RESULT.MT_SUCCESS) MessageBox.Show("Fail Reset()"); 14
外部機器で発生した異常を通知する センサなど外部機器が捉えた異常を Msako に通知するためには MsakoTranceiver の Alarm メソッドを使う 次の例は 画面上にある4つのチェックボックスの値を各警報チャネルのビット値にみたてて通知する例である ch4 = 1, ch3 = 1, ch2 = 0, ch1 = 1 Dim channels As Integer channels = 0 If chkalarm1.checked Then channels = channels Or &H1 If chkalarm2.checked Then channels = channels Or &H2 If chkalarm3.checked Then channels = channels Or &H4 If chkalarm4.checked Then channels = channels Or &H8 If MsakoTranceiver1.Alarm(channels) <> MT_RESULT.MT_SUCCESS Then MessageBox.Show("Fail Alarm()") C#.NET の場合 int channels = 0; if (chkalarm1.checked) channels = 0x00000001; if (chkalarm2.checked) channels = 0x00000002; if (chkalarm3.checked) channels = 0x00000004; if (chkalarm4.checked) channels = 0x00000008; if (MsakoTranceiver1.Alarm(channels)!= MT_RESULT.MT_SUCCESS) MessageBox.Show("Fail Alarm()"); 15
イベント番号一覧を取得する バージョン番号の一覧を取得するためには MsakoTranceiver の GetEventList メソッドを使う このメソッド は 引数で与えた整数を要素とするリスト System.Collections.Generic.List にイベント番号の一覧を返す Dim list As New List(Of Integer) If MsakoTranceiver1. GetEventList(list) <> MT_RESULT.MT_SUCCESS Then MessageBox.Show("Failed GetEventList()") C#.NET の場合 List<int> list = new List<int>(); if (MsakoTranceiver1.GetEventList(ref list)!= MT_RESULT.MT_SUCCESS) MessageBox.Show("Fail GetEventList()"); 16
イベント情報を取得する Msako が保持している特定の 1 つのイベントの情報を取得するためには MsakoTranceiver の GetEventData メソッ ドを使う 次の例は イベント番号 31 の延べ時間をテキストボックスに表示する例である Dim data As MM_EVENT_PROFILE = New MM_EVENT_PROFILE() If MsakoTranceiver1.GetEventData(31, data) = MT_RESULT.MT_SUCCESS Then textduration.text = data.duration.tostring() Else MessageBox.Show("Failed GetEventData()") C#.NET の場合 MM_EVENT_PROFILE data = new MM_EVENT_PROFILE(); if (MsakoTranceiver1. GetEventData(31, ref data) == MT_RESULT.MT_SUCCESS) { textduration.text = data.duration.tostring(); } else { MessageBox.Show("Fail GetEventData()"); } 17
イベント画像を取得する Msako が保持している特定の1つのイベントの画像を取得するためには MsakoTranceiver の GetEventImage メソッドを使う このメソッドは 引数で与えた System.Drawing.Bitmap に 引数で指定したイベント番号の画像を返す 次の例は イベント番号 15の画像を取得する例である Dim bmp As Bitmap = Nothing If MsakoTranceiver1.GetEventImage(15, bmp, 200) <> MT_RESULT.MT_SUCCESS Then MessageBox.Show("Failed GetEventImage()") C#.NET の場合 Bitmap bmp = null; if (MsakoTranceiver1.GetEventImage(15, ref bmp, 200)!= MT_RESULT.MT_SUCCESS) { MessageBox.Show("Fail GetEventImage()"); } 18
サンプルプログラムを実行する MsakoAPI のサンプルプログラムには ソースとそれにもとづいて作成された実行プログラムが含まれている このサンプルプログラムは MsakoAPI を使って独自のプログラムを作成するにあたり 素早く MsakoAPI の使用法を理解するのに役立つだろう ここでは このサンプルプログラムを起動して操作するする手順を説明する なお このサンプルプログラムは Microsoft Visual Studio 2010 Professional にて作成されている (1) サンプルプログラムを起動する前に Msako 本体を起動しておく (2) Msako の詳細設定タブにあるメッセージに関する設定を次のように設定する (3) 続いてサンプルプロフラムを起動する サンプルプログラムには C# 版と Visual Basic 版があるが機 能は全く同じである C# 版 MsakoAppCS_*.*\bin\Release\MsakoAppCS.exe Visual Basic 版 MsakoAppVB_*.*\bin\Release\MsakoAppVB.exe 19
(4) 次のようなサンプルプログラムの画面が表示される (5) サンプルプログラムの画面にある [Discover] ボタンを押す これによって 現在起動されている Msako と接続される Msako が複数のカメラを使用している場合 MsakoAPI は任意のカメラと接続できるが このサンプルプログラムでは最初に発見したカメラと接続するようになっている (6) [Get Name] ボタンを押すと接続されたカメラの名前が表示される また同様に [Get Size] は画像の大きさ [Get Status] は現在の状態が表示される (7) [Get Param] および [Set Param] は設定値の取得 変更を行うことができる (4) の例は 感度を 85% に設定している (8) [Listen] ボタンを押すと 例えば イベントが開始した (WM_MSAKO_EVENT_START) とか 動体を検知した (WM_MSAKO_MOTION_DETECTED) といった MsakoAPI のイベントが受信可能になる (9) [Start] ボタンを押すと Msako の監視が開始する 反対に [Stop] ボタンで監視を停止する (10) [Alarm] ボタンはその右側にあるチェックボックスで設定された外部トリガー信号を Msako に送出する これによって Msako のイベント一覧には外部トリガーのイベントが表示される (11) [Snapshot] ボタンを押すと現在の画像が表示される (12) 動体を検知すると Cx Cy 欄にターゲットの重心位置 Spot 欄にターゲットのスポット領域の番号が表示される (13) 動体検知のイベントが終了するとイベントの画像が表示され 画面の一番下にイベントの経過時間とレベル値 (db) が表示される 20