Estoy usando opencv-python y cuando ejecuto el siguiente código:
index = 0 cap = cv2.VideoCapture(video_path) while True: offset = cap.get(cv2.CAP_PROP_POS_MSEC) print(cv2.__version__, index, offset) ok, frame = cap.read() if not ok: break index += 1Obtengo el siguiente resultado:
3.4.7 0 0.0 3.4.7 1 33.36666666666667 3.4.7 2 66.73333333333333 3.4.7 3 100.10000000000001 3.4.7 4 133.46666666666667 Si ejecuto este código en la versión 3.4.8.29 , obtengo el siguiente resultado:
3.4.8 0 0.0 3.4.8 1 0.0 3.4.8 2 33.36666666666667 3.4.8 3 66.73333333333333 3.4.8 4 100.10000000000001 Y si lo ejecuto en la versión 4.5.2.52 obtengo:
4.5.2 0 0.0 4.5.2 1 0.0 4.5.2 2 0.0 4.5.2 3 0.0 4.5.2 4 0.0La pregunta es en primer lugar, ¿cuál es la correcta? Parece que 3.4.7 es correcto, pero también parece estar cambiando aleatoriamente entre versiones.
Y también, ¿cómo puedo modificar las otras versiones para obtener el resultado adecuado, igual que 3.4.7
Leí los documentos de OpenCV y dijeron: "Las propiedades de lectura/escritura involucran muchas capas. Es posible que ocurra algún resultado inesperado a lo largo de esta cadena. El comportamiento efectivo depende del hardware del dispositivo, el controlador y el API Backend". (fuente: https://docs.opencv.org/3.4.15/d4/d15/group__videoio__flags__base.html#gaeb8dd9c89c10a5c63c139bf7c4f5704d )
Entonces, en otras palabras, OpenCV no garantiza un comportamiento consistente y confiable de esta función.
También instalé openCV 4.5.2.52 y apliqué su script a uno de mis videos '.mp4'. Luego obtuve el mismo resultado que tenía para openCV versión 3.4.8.29. Entonces, creo que el comportamiento que experimenta no es un 'error', sino el comportamiento poco confiable de esta función.
Como solución alternativa, puede calcular el "desplazamiento" dividiendo el número de cuadro por el recuento de FPS (consulte el código a continuación). Entonces tienes más control sobre el comportamiento y quizás resultados más consistentes.
index = 0 cap = cv2.VideoCapture(video_path) fps = cap.get(cv2.CAP_PROP_FPS) while True: offset = cap.get(cv2.CAP_PROP_POS_MSEC) ok, frame = cap.read() if not ok: break # CAP_PROP_POS_MSEC print("CAP_PROP_POS_MSEC: ", index, offset) # Devide fps by frame number offset = cap.get(cv2.CAP_PROP_POS_FRAMES) / fps * 1000 print("cv2.CAP_PROP_POS_FRAMES", index, offset) index += 1