Я пытаюсь подсчитать волнение игрока, получая видеоисточник из веб-камеры в единстве. Я вычисляю разницу пикселей для каждого кадра и на основе этого рассчитываю оценку (волнение = изменение количества в последовательности кадров). Проблема здесь в том, что он требует огромного количества ресурсов процессора, а частота кадров резко снижается, когда начинается этот расчет.
Ниже приведен справочный код.
private Color[] prevPixels;
public float getExcitement(Color[] curPixels)
{
float excitment = 0;
// To store pixelArray for the first time when this method is called
if (prevPixels == null)
prevPixels = curPixels;
else if (prevPixels != null && curPixels != null)
{
excitment = PixelDiff(curPixels);
prevPixels = curPixels;
}
return excitment;
}
private float PixelDiff(Color[] curPixels)
{
float diff = 0f;
for(int i = 0; i < curPixels.Length; i++)
{
float r1 = prevPixels[i].r;
float g1 = prevPixels[i].g;
float b1 = prevPixels[i].b;
float r2 = curPixels[i].r;
float g2 = curPixels[i].g;
float b2 = curPixels[i].b;
float r = r2 - r1;
float g = g2 - g1;
float b = b2 - b1;
diff += Mathf.Sqrt(r * r + g * g + b * b);
}
return diff;
}
Пожалуйста, предложите лучший подход к решению этой проблемы или альтернативный способ реально рассчитать волнение.
Многопоточность, вычисление шейдеров и т. д. Множество способов улучшить производительность (хотя лично я сомневаюсь, что определение «азарта» игрока на основе видеозаписей с веб-камеры действительно работает)
да, я вызываю это из метода обновления. Пробовал многопоточность, добавляя кадры в очередь и дочерний поток, вычисляя значение возбуждения и обновляя его; но в этом сценарии он тоже не работает, но даст еще один шанс
Вам, вероятно, не нужно звонить 30 раз в секунду. Вы можете звонить примерно раз в секунду ...
Одна секунда будет слишком медленной для моего проекта, даже если я называю это так, как будто один раз в каждые 3/4 кадра время расчета слишком велико. Я уменьшил текстуру кулачка с 1920/1080 до 960/720, что улучшило производительность, но все еще недостаточно. У меня тоже возникают проблемы с многопоточностью, когда я когда-либо вызываю это в другом раунде
Это буквально отдельная тема, но вот несколько мыслей, по крайней мере, для начала. (1) Вероятно, есть пиксели, которые можно пропустить. Поскольку на самом деле вы смотрите только на «человека», другие пиксели бесполезны. Вы можете определить, какие это пиксели, объединив данные из первых нескольких кадров. (2) Как говорят другие, сократите количество опросов. Проведите несколько тестов, чтобы понять, что «работает» для вас. (3) Многопоточность почти наверняка понадобится. Завершите чтение или разместите здесь код с потоками, и мы можем помочь. (4) Наконец, Mathf.Sqrt стоит дорого. НЕ используйте Sqrt!
Уменьшите размер изображения с 960/720 до 96/72 - анализ изображения почти всегда выполняется с уменьшенным размером изображения.





Вместо того, чтобы сохранять всю текстуру веб-камеры, просто сохраните, например, самые нижние и самые верхние строки пикселей и вычислите различия по ним. Результаты будут очень сильно коррелированы с созданием всей текстуры веб-камеры.
Вы случайно не рассчитываете это методом
Update?