Ответ 1
Прежде всего (возможно, это не ваш случай, поскольку вы указали, что работаете над видео, а не с камерой), если вы основываете свой код на значении частоты кадров, убедитесь, что 30 кадров в секунду эффективная стоимость, а не максимальная. Иногда камеры автоматически корректируют это число в зависимости от количества света, которое они получают от окружающей среды. Если он темный, время экспозиции увеличивается, и поэтому частота кадров уменьшается.
Во-вторых, очень сложно смоделировать реальный механизм экспозиции фотографий, учитывая кучу пикселей.
Представьте, что вы хотите удвоить время экспозиции, это должно быть смоделировано двумя последовательными кадрами.
В реальном мире удвоение времени экспозиции означает, что скорость затвора уменьшена вдвое, и в два раза больше света попадает на датчик или пленку, в результате получается более яркое изображение.
Как вы имитируете это? Рассмотрим для простоты случай двух довольно ярких изображений в оттенках серого, которые вы хотите объединить. Если в заданной точке значения пикселей, скажем, 180 и 181, каково результирующее значение? Первый ответ будет равен 180 + 181, но интенсивность пикселей колеблется от 0 до 255, поэтому его нужно усечь на 255.
Реальная камера с повышенной экспозицией, вероятно, будет вести себя по-другому, не достигая максимального значения.
Теперь я рассматриваю ваш код.
При первом запуске изображения (например, запустите функцию) вы просто сохраните фрейм в переменной _exposed.
Во второй раз вы смешиваете 29/30 нового кадра и 1/30 ранее сохраненного изображения.
Третий раз 29/30 третьего кадра с результатом предыдущей операции. Это приводит к тому, что на первый кадр исчезает затухающий вес, который практически исчез.
В последний раз, когда вы вызываете эту функцию, вы снова суммируете 29/30 последнего кадра и 1/30 предыдущего результата. В свою очередь это означает, что эффект первых кадров практически исчез, и даже предыдущий учитывается только для доли 29/(30x30).
Изображение, которое вы получаете, - это только последний кадр с небольшим размытием, исходящим из предыдущих кадров.
Как вы получаете симуляцию воздействия?
Если вы просто хотите усреднить 30 кадров, вы должны заменить эти строки:
if (_frameCount == 0) {
_exposed = image.clone();
addWeighted(_exposed, 0.0, image, alpha, 0.0, _exposed);
} else {
addWeighted(_exposed, 1.0, image, alpha, 0.0, _exposed);
}
_frameCount++;
Если вы также хотите сделать изображение ярче в некоторой степени, вы можете имитировать его с помощью коэффициента умножения:
if (_frameCount == 0) {
_exposed = image.clone();
addWeighted(_exposed, 0.0, image, alpha*brightfactor, 0.0, _exposed);
} else {
addWeighted(_exposed, 1.0, image, alpha*brightfactor, 0.0, _exposed);
}
_frameCount++;
Настройте ярлык на значение, которое лучше всего имитирует реальное увеличение времени экспозиции. (EDIT: значение от 1,5 до 2,5 должно выполняться)