GetFacePointsInColorSpace returning all 0s multiple times a second
Face APIの各メソッドで取れる値が異なるケースがある
KINECT v2ではFace関連のAPIが多くあります。SDKにもサンプルがいくつか付いていますが、サンプルを動かしてみるとFace APIの GetFracePointsInColorSpace()
が時々結果が入っていないフレーム(全データが0sのフレーム)を返してくることがあります。
これ自体はそんなに珍しいことではないのですが、同じフレームに対して get_FaceBoundingBoxInColorSpace()
を実行するとちゃんとした結果が返ってきてしまう。どっちを信じたらいいの?という質問です。ちなみに質問者のケースでは GetFaceProperties()
も DetectionResult_No
を返してくるようです。
結論では GetFacePointsInColorSpace()
で結果が帰ってこないフレームは無視してスキップしたほうが良いという回答が付いていました。
Face APIにかぎらず、KINECTから送られてくるフレームでは情報が落ちていることが時々あります。 *1
基本的にこのようなフレームはスキップするなりして、平均的な値をアプリケーションで扱うようにする方が良いようです。例えば今回の例では以下の様なコードを用いてすべてのフレームを検査することで余計なデータを回避することができます。
// check if this face frame has valid face frame results if (this.ValidateFaceBoxAndPoints(faceFrame.FaceFrameResult)) { // store this face frame result to draw later this.faceFrameResults[index] = faceFrame.FaceFrameResult; } else { // indicates that the latest face frame result from this reader is invalid this.faceFrameResults[index] = null; }
*1:Bodyに関して言えば外れ値が出るケースが多いので外れ値を無視するコードの利用が推奨されています