GetFacePointsInColorSpace returning all 0s multiple times a second

元ネタ

Face APIの各メソッドで取れる値が異なるケースがある

KINECT v2ではFace関連のAPIが多くあります。SDKにもサンプルがいくつか付いていますが、サンプルを動かしてみるとFace APIGetFracePointsInColorSpace() が時々結果が入っていないフレーム(全データが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に関して言えば外れ値が出るケースが多いので外れ値を無視するコードの利用が推奨されています