Как мы можем сделать временную фильтрацию для обработки видео?

Чтобы помочь уменьшить шаблон, я использую следующие interface и class для чтения / записи в Bundle для сохранения состояния экземпляра.


Сначала создайте интерфейс, который будет используется для аннотирования ваших переменных экземпляра:

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({
        ElementType.FIELD
})
public @interface SaveInstance {

}

Затем создайте класс, в котором отражение будет использоваться для сохранения значений в комплекте:

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.Log;

import java.io.Serializable;
import java.lang.reflect.Field;

/**
 * Save and load fields to/from a {@link Bundle}. All fields should be annotated with {@link
 * SaveInstance}.

*/ public class Icicle { private static final String TAG = "Icicle"; /** * Find all fields with the {@link SaveInstance} annotation and add them to the {@link Bundle}. * * @param outState * The bundle from {@link Activity#onSaveInstanceState(Bundle)} or {@link * Fragment#onSaveInstanceState(Bundle)} * @param classInstance * The object to access the fields which have the {@link SaveInstance} annotation. * @see #load(Bundle, Object) */ public static void save(Bundle outState, Object classInstance) { save(outState, classInstance, classInstance.getClass()); } /** * Find all fields with the {@link SaveInstance} annotation and add them to the {@link Bundle}. * * @param outState * The bundle from {@link Activity#onSaveInstanceState(Bundle)} or {@link * Fragment#onSaveInstanceState(Bundle)} * @param classInstance * The object to access the fields which have the {@link SaveInstance} annotation. * @param baseClass * Base class, used to get all superclasses of the instance. * @see #load(Bundle, Object, Class) */ public static void save(Bundle outState, Object classInstance, Class baseClass) { if (outState == null) { return; } Class clazz = classInstance.getClass(); while (baseClass.isAssignableFrom(clazz)) { String className = clazz.getName(); for (Field field : clazz.getDeclaredFields()) { if (field.isAnnotationPresent(SaveInstance.class)) { field.setAccessible(true); String key = className + "#" + field.getName(); try { Object value = field.get(classInstance); if (value instanceof Parcelable) { outState.putParcelable(key, (Parcelable) value); } else if (value instanceof Serializable) { outState.putSerializable(key, (Serializable) value); } } catch (Throwable t) { Log.d(TAG, "The field '" + key + "' was not added to the bundle"); } } } clazz = clazz.getSuperclass(); } } /** * Load all saved fields that have the {@link SaveInstance} annotation. * * @param savedInstanceState * The saved-instance {@link Bundle} from an {@link Activity} or {@link Fragment}. * @param classInstance * The object to access the fields which have the {@link SaveInstance} annotation. * @see #save(Bundle, Object) */ public static void load(Bundle savedInstanceState, Object classInstance) { load(savedInstanceState, classInstance, classInstance.getClass()); } /** * Load all saved fields that have the {@link SaveInstance} annotation. * * @param savedInstanceState * The saved-instance {@link Bundle} from an {@link Activity} or {@link Fragment}. * @param classInstance * The object to access the fields which have the {@link SaveInstance} annotation. * @param baseClass * Base class, used to get all superclasses of the instance. * @see #save(Bundle, Object, Class) */ public static void load(Bundle savedInstanceState, Object classInstance, Class baseClass) { if (savedInstanceState == null) { return; } Class clazz = classInstance.getClass(); while (baseClass.isAssignableFrom(clazz)) { String className = clazz.getName(); for (Field field : clazz.getDeclaredFields()) { if (field.isAnnotationPresent(SaveInstance.class)) { String key = className + "#" + field.getName(); field.setAccessible(true); try { Object fieldVal = savedInstanceState.get(key); if (fieldVal != null) { field.set(classInstance, fieldVal); } } catch (Throwable t) { Log.d(TAG, "The field '" + key + "' was not retrieved from the bundle"); } } } clazz = clazz.getSuperclass(); } } }

Пример использования:

public class MainActivity extends Activity {

    @SaveInstance
    private String foo;

    @SaveInstance
    private int bar;

    @SaveInstance
    private Intent baz;

    @SaveInstance
    private boolean qux;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Icicle.load(savedInstanceState, this);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Icicle.save(outState, this);
    }

}

Примечание. Этот код был адаптирован из проекта библиотеки с именем AndroidAutowire , который лицензируется в соответствии с лицензией MIT .

0
задан Alex 25 March 2019 в 01:12
поделиться

1 ответ

В этом примере они говорят о конкретной известной скорости. Например, если вы знаете, что автомобиль движется влево с 2 пикселями на кадр. Можно сделать видео, которое размывает все, кроме этой машины.

Вот идея: начните с кадра 0 видео. На каждый пиксель посмотрите один кадр в будущем и оставьте 2 пикселя. Вы будете смотреть на ту же часть движущейся машины. Теперь представьте, что вы берете среднее значение цвета между вашим текущим пикселем и усилением; будущий пиксель (оставшийся 2 пикселя и 1 кадр в будущем). Если ваш пиксель находится на движущейся машине, оба пикселя будут одинакового цвета, поэтому взятие среднего значения не имеет никакого эффекта. С другой стороны, если это НЕ на движущейся машине, они будут разных цветов, и поэтому среднее значение будет иметь эффект размытия между ними.

Таким образом, пиксели автомобиля останутся неизменными, но остальная часть видео получит размытие. Повторите для каждого кадра. Вы также можете включить больше кадров в свой фильтр; например Вы можете посмотреть 2 кадра в будущем и 4 пикселя влево или 1 кадр в прошлом и 2 пикселя вправо.

Примечание: это был обучающий пример; Я не думаю, что есть много реальных приложений компьютерного зрения для этого (по крайней мере, не как отдельная техника), потому что это настолько хрупко. Если автомобиль ускоряется или немного замедляется, он становится размытым.

0
ответ дан Luke 25 March 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: