Cómo procesar imágenes de un video, cuadro por cuadro en transmisión de video usando Opencv python

Soy un principiante en OpenCV. Quiero hacer un procesamiento de imágenes en los cuadros de un video que se está cargando en mi servidor. Solo quiero leer los marcos disponibles y escribirlos en un directorio. Y espere a que se cargue otra parte del video y escriba los marcos en el directorio. Y debo esperar a que cada fotogtwig se cargue por completo y luego escribirlo en un archivo.

¿Puedes decirme cómo puedo hacerlo con OpenCV (Python)?

Edición 1: escribí este código para capturar el video de un archivo, mientras que los nuevos datos se agregan al final del archivo. En otras palabras, el archivo out.mp4 no es un video completo y otro progtwig está escribiendo nuevos marcos en él. Lo que voy a hacer es esperar a que el otro progtwig escriba nuevos marcos y luego leerlos y mostrarlos.

Aquí está mi código:

 import cv2 cap = cv2.VideoCapture("./out.mp4") while True: if cap.grab(): flag, frame = cap.retrieve() if not flag: continue else: cv2.imshow('video', frame) if cv2.waitKey(10) == 27: break 

Así que el problema es la llamada cap.grab() ! Cuando no hay marco, devolverá False ! Y ya no capturará marcos, incluso si espero mucho tiempo.

Después de leer la documentación de VideoCapture . Me di cuenta de que puedes decirle a VideoCapture , qué fotogtwig se procesará la próxima vez que llamemos VideoCapture.read() (o VideoCapture.grab() ).

El problema es que cuando desea read() un cuadro que no está listo, el objeto VideoCapture atasca en ese cuadro y nunca continúa. Así que tienes que forzarlo para que comience nuevamente desde el cuadro anterior.

Aquí está el código

 import cv2 cap = cv2.VideoCapture("./out.mp4") while not cap.isOpened(): cap = cv2.VideoCapture("./out.mp4") cv2.waitKey(1000) print "Wait for the header" pos_frame = cap.get(cv2.cv.CV_CAP_PROP_POS_FRAMES) while True: flag, frame = cap.read() if flag: # The frame is ready and already captured cv2.imshow('video', frame) pos_frame = cap.get(cv2.cv.CV_CAP_PROP_POS_FRAMES) print str(pos_frame)+" frames" else: # The next frame is not ready, so we try to read it again cap.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, pos_frame-1) print "frame is not ready" # It is better to wait for a while for the next frame to be ready cv2.waitKey(1000) if cv2.waitKey(10) == 27: break if cap.get(cv2.cv.CV_CAP_PROP_POS_FRAMES) == cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT): # If the number of captured frames is equal to the total number of frames, # we stop break 

utilizar esta –

 import cv2 cap = cv2.VideoCapture('path of video file') count = 0 while cap.isOpened(): ret,frame = cap.read() cv2.imshow('window-name',frame) cv2.imwrite("frame%d.jpg" % count, frame) count = count + 1 if cv2.waitKey(10) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() # destroy all the opened windows 

En la documentación de openCV hay un ejemplo para obtener video cuadro por cuadro. Está escrito en c ++ pero es muy fácil trasladar el ejemplo a python; puede buscar cada documentación de fumction para ver cómo llamarlos en python.

 #include "opencv2/opencv.hpp" using namespace cv; int main(int, char**) { VideoCapture cap(0); // open the default camera if(!cap.isOpened()) // check if we succeeded return -1; Mat edges; namedWindow("edges",1); for(;;) { Mat frame; cap >> frame; // get a new frame from camera cvtColor(frame, edges, CV_BGR2GRAY); GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); Canny(edges, edges, 0, 30, 3); imshow("edges", edges); if(waitKey(30) >= 0) break; } // the camera will be deinitialized automatically in VideoCapture destructor return 0; } 

De acuerdo con las últimas actualizaciones para OpenCV 3.0 y versiones posteriores, necesita cambiar los identificadores de propiedad de la siguiente manera en el código de Mehran:

 cv2.cv.CV_CAP_PROP_POS_FRAMES 

a

 cv2.CAP_PROP_POS_FRAMES 

y lo mismo se aplica a cv2.CAP_PROP_POS_FRAME_COUNT .

Espero eso ayude.

Así es como empezaría a resolver esto:

  1. Crear un escritor de video:

     import cv2.cv as cv videowriter = cv.CreateVideoWriter( filename, fourcc, fps, frameSize) 

    Consulte aquí los parámetros válidos

  2. Repetir para recuperar [1] y escribir los marcos:

     cv.WriteFrame( videowriter, frame ) 

    WriteFrame doc

[1] zenpoy ya apuntaba en la dirección correcta. Solo necesita saber que puede recuperar imágenes de una cámara web o un archivo 🙂

Espero haber entendido los requisitos correctos.

La única solución que he encontrado no es establecer el índice en un cuadro anterior y esperar (de todos modos, OpenCV deja de leer marcos), sino inicializar la captura una vez más. Entonces, se ve así:

 cap = cv2.VideoCapture(camera_url) while True: ret, frame = cap.read() if not ret: cap = cv.VideoCapture(camera_url) continue # do your processing here 

¡Y funciona perfectamente!