opencv - premiere - keyframe que es
Extracción de fotograma clave del video (5)
Asumiré que un fotograma clave es un marco que presenta un contenido muy diferente de los anteriores (no es una definición formal, pero se ajusta). Toma marcos i e i + 1 . Utilice cv2.absDiff para calcular la diferencia entre los marcos y cv2.sumElems para obtener la suma de todas las diferencias de píxeles. Haz esto para todos los marcos i . Esto reducirá la transmisión de video a una señal unidimensional . Busque picos en esta señal y elija fotogramas clave correspondientes a estos picos.
Necesito extraer cuadros clave de Video / Stream. Así que hay una implementación estándar. Estoy usando CV abierto. (Actualmente estoy extrayendo fotogramas cada segundo, lo cual es más lento, necesito mejorar el rendimiento.) Entonces, si alguien ha optimizado la implementación, responda aquí.
Usando ffmpeg puedes extraer todos los fotogramas clave usando el siguiente código:
ffmpeg -vf select="eq(pict_type/,PICT_TYPE_I)" -i yourvideo.mp4 -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg
Lo que sigue -vf en una línea de comando ffmpeg es una descripción de Filtergraph. El filtro de selección selecciona marcos para pasar la salida. La constante del filtro es "tipo_pictura" y el valor "PICT_TYPE_I". Entonces ffmpeg solo está pasando fotogramas clave a la salida.
-vsync 2 evita que ffmpeg genere más de una copia para cada fotograma clave.
-f image2 escribe cuadros de video en archivos de imagen. Los nombres de archivo de salida se especifican mediante un patrón, que se puede usar para producir series de archivos numeradas secuencialmente. El patrón puede contener la cadena "% d" o "% 0Nd".
Referencia: http://www.videoproductionslondon.com/blog/scene-change-detection-during-encoding-key-frame-extraction-code
La solución de ffmpeg debería funcionar bien.
Para alguien que tiene problemas con el filtro de selección ''eq (pict_type /, PICT_TYPE_I)'', es posible que desee probar el filtro como ''eq (pict_type /, I)''. Esto se rompió por un tiempo, por lo que algunas versiones de ffmpeg podrían no reconocer la constante. La solución se puede ver aquí .
El último comando que funcionó para mí finalmente fue:
ffmpeg -vf select=''eq(pict_type/,I)'' -i yourVideo.mp4 -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg
Si hay algo mal con el código anterior, intente este orden de argumento en su lugar.
ffmpeg -i yourVideo.mp4 -vf select=''eq(pict_type/,I)'' -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg
Puede usar ffprobe para extraer cuadros clave. Es una herramienta en ffmpeg.
ffprobe in.mp4 -select_streams v -show_entries frame = key_frame, pkt_pts_time -of csv = nk = 1: p = 0 | findstr "1"