2

私は現在、リアルタイム通信を使用して、C# WPF のソケットを使用してクライアントからサーバーにデータを転送するデスクトップ ソフトウェア ソリューションを開発しています。クライアントとサーバーは同じアプリケーションで定義されますが、ロールはユーザー タイプに基づいて決定されます (生徒はクライアントであり、教師はサーバーとして機能します)。

Affdex 3.0 SDK を使用して生徒の表情データをキャプチャし、サーバーに送信しています。

私の問題は、CameraDetector が初めて開始され、最初の顔が追跡されると、すべてが正常に機能することですが、顔が失われ、再度追跡するために画像に再入力されるとすぐに、新しく検出された顔がコレクションに追加されます。最初に再挿入される代わりに、key not found exception. 顔の有効な顔が見つかるまでコレクションをループすることを考えましたが、それは理想的な解決策ではありません。

public void onImageResults(Dictionary<int, Affdex.Face> faces, Affdex.Frame image)
    {
        Affdex.Face face;
        if (faces.Count() >= 1)
        {
            try
            {
                face = faces[0];
                UpdateExpressionsDials(face);
            }
            catch(Exception e)
            {
                Console.WriteLine("face failed " + e.Message.ToString());
            }
        }
    }

これは で失敗しますface failed The given key was not present in the dictionary. A first chance exception of type 'System.Collections.Generic.KeyNotFoundException' occurred in mscorlib.dll

これを行うより良い方法はありますか?Listener の周りにラッパーを作成し、面がある場合は常に最初にあることを確認するのが賢明でしょうか?

これは私の最初の質問なので、質問から何かを省略した場合はお知らせください。ありがとう

4

1 に答える 1

2

このonImageResults呼び出しはDictionary<int, Affdex.Face> faces、key=an int を表す顔 ID と value=Affdex.Face のディクショナリである a を返します。

あなたのコードは、顔 ID が常に 0 になると想定していますが、これは正しくありません。

その発言

face = faces[0]

Dictionary に空のノードを作成しますkey=0

代わりに、 Dictionary アイテムを反復処理する必要があります

foreach (KeyValuePair<int, Affdex.Face> pair in Faces)
{
    Affdex.Face face = pair.Value;
    UpdateExpressionsDials(face);
}

または、検出する顔の数を 1 に設定することによって、ディクショナリに最大で 1 つのエントリしかないことがわかっている場合は、次のように使用できます。Collection.First().Value

于 2016-02-22T13:43:03.840 に答える