Почему слушатель OnImageResults продолжает добавлять лица в коллекцию, когда лицо теряется, вместо повторной вставки в начале?

В настоящее время я разрабатываю настольное программное решение, которое использует связь в реальном времени для передачи данных от клиента на сервер с использованием сокетов в 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 и убедиться, что если есть лицо, оно всегда находится в начале?

Это мой первый вопрос, поэтому, пожалуйста, дайте мне знать, если я что-то упустил из вопроса. Спасибо


person Remus.A    schedule 20.02.2016    source источник
comment
Удалось избежать возникновения исключения с помощью Collection.First().Value, и теперь, похоже, все работает нормально. Если у кого-то есть другие предложения, я бы приветствовал их.   -  person Remus.A    schedule 20.02.2016


Ответы (1)


Вызов onImageResults возвращает Dictionary<int, Affdex.Face> faces, который является словарем, состоящим из ключа = int, представляющего идентификатор лица, и значения = Affdex.Face.

Ваш код предполагает, что идентификатор лица всегда будет равен 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

person ahamino    schedule 22.02.2016
comment
Спасибо за ответ. Это то, что я в итоге сделал, и это работает надежно. - person Remus.A; 23.02.2016