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调用返回a Dictionary<int, Affdex.Face> faces,它是一个key=an表示人脸id的int和一个value=Affdex.Face的字典。

您的代码假定人脸 ID 将始终为 0,这是不正确的。

那句话

face = faces[0]

在 Dictionary 中创建一个空节点key=0

相反,您应该遍历 Dictionary 项目

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

或者,如果您只知道 Dictionary 最多会有一个条目,即通过将要检测的面数设置为 1。然后,您可以只使用Collection.First().Value

于 2016-02-22T13:43:03.840 回答