为什么OnImageResults侦听器会在面部丢失而不是在开头重新插入时继续将面附加到集合中?

时间:2016-02-20 10:54:09

标签: c# wpf affdex-sdk

我目前正在开发一种桌面软件解决方案,该解决方案使用实时通信,使用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周围创建一个包装器是否明智,并确保如果有一个面,它总是在开头?

这是我的第一个问题,如果我遗漏了问题中的任何内容,请告诉我。感谢

1 个答案:

答案 0 :(得分:2)

onImageResults调用返回Dictionary<int, Affdex.Face> faces,它是一个键的字典=表示面部id的int和值= Affdex.Face。

您的代码假定面部ID始终为0,这是不正确的。

该陈述

face = faces[0]

使用key=0

在词典中创建一个空节点

相反,你应该迭代字典项

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

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