Kinectの停止と終了について
公式の資料が公開されました
KinectForWindowsSDK1.5の公開に伴って、MSDN LibraryにKinectForWindowsSDKの項目が追加されました。そこで確認する限り、Disposeによって全てのストリームが閉じられていることが分かります。よってKinectのアプリケーションを終了する場合には「KinectSensor.Dispose()」だけ実行すれば良いことになります。検証内容が正しかったので"まぁ良し"にしてしまいましょう。
このページに掲載される以降の情報は古い情報で、KinectForWindowsSDK1.5以降のバージョンでは適応されない点に注意してください。「KinectSensor.Stopの後、FrameReadyイベント内でExceptionが生じる問題の解決」については未検証ですので十分に注意してください。
About
現状でKinectSensorを使ったアプリケーションを終了する場合は恐らく次の手順を取ることになる。「停止→破棄」。
kinect.Stop(); kinect.Dispose();
- この様に実装する必要性は次のページに解説してあるので参照されたい。
- 「KinectSensor.Stopの後、FrameReadyイベント内でExceptionが生じる問題の解決」
- 自作ライブラリ「Extend Kinect Library 」に実装した拡張メソッド「Close」は
「Stop→Dispose」するメソッドになっている。
所が実際はColorStream、DepthStream、AudioSourceなどのストリームが解放されている。果たしてStopとDisposeだけできちんと終了されてStreamが閉じられているのか、検証する必要があった(資料を見つけることができなかった)。そもそもStopをせずにDisposeしてインスタンスを破棄した場合はどうなるのか。この疑問に至ったのはある現象に行き当たったからである。
「あれ?赤外線放出部分赤く光ってね?」 実際赤く光っている。肉眼で見た通りには写真に収めることが出来ないのだが、Kinect動作時に肉眼で動作しているのを確認出来るのは周知の通りだと思う。ただしこれが終了後も続いたのだ。※画像はAndroidのカメラで正面から撮影したもの。
原因は何のことはない「VisualStudioのDebugで起動して停止ボタンでDebugを終了したため、Close処理が呼び出されなかった」のである。(いやでも結構バカにできないと思う。やりがちなミス。)
まぁそこで今回の問題に行きついたわけだ。そんなわけで手に入れたばっかりの「KinectForWindows」と「KinectForXBOX」の双方で終了に関する実験を行った。
実験
実験内容
- 「KinectSensor」の「Dispose」ないし「Stop」を実行する前に「DepthStream」の「Disable」を実行する場合としない場合とで、Kinectの赤外線放射部位の様子を確認する。
- (本当はStreamの解析方法あるのだろうけど、私にはそんな高度な技術が無かった)
- 「Stop→Dispose」の流れを踏まずに終了する場合の同様子を確認する。
- 「VisualStudio2010」のデバッグモードを利用
- そもそも「Dispose」を行うことで「Stop」の代替になるのかを確認する。
- 先にも説明した通り「Stop」だけでは不十分な場合があるが、「Dispose」だけで不十分であるかは分からない。
- 参考「KinectSensor.Stopの後、FrameReadyイベント内でExceptionが生じる問題の解決」
- 「KinectForWindows」と「KinectForXBOX」の双方で確認を取る。
結論・結論
- 各Streamを「Disable」せずに「Stop」ないし「Dispose」してもStreamは正常に閉じられているようである。
- 少なくともKinectからの赤外線放出は止まる。
- 「Dispose」してインスタンスを破棄すると、どうやらStreamも閉じているようである。
- 少なくともKinectからの赤外線放出は止まる。
- 「Stop」「Dispose」の何れも実行しないで終了すると、Kinectは赤外線を放出し続けている。
- VisualStudioのデバッグモードで実行する場合は気をつける。
- WindowなどのCloseイベントにKinectの終了処理をフックしている場合、Streamが解放されたままになる(赤外線が放出され続ける)。
- VisualStudioのデバッグモードで実行する場合は気をつける。
- Kinectからの赤外線放出停止までの時間は、マチマチである。
- 「Stop→Dispose」「Disposeのみ」「Stopのみ」何れの場合も特に高速に停止されるなどといったことはない。
- 稀に早いので原因はあるかもしれない。
- KinectForWindowsでもKinectForXBOXでも上記の全ては共通に発生する。
- 止まるからって怖いので、きちんと「Stop→Dispose」の流れを踏んでおく。公式なアナウンスがあるまでは…。