Opencv: Erreur d'arrondi de la fréquence d'images de VideoWriter

Créé le 28 juin 2017  ·  3Commentaires  ·  Source: opencv/opencv

Informations système (version)
  • OpenCV => 3.2.0
  • Système d'exploitation / plate-forme => Ubuntu
  • Compilateur => GCC 5.4.0 20160609
Description détaillée

Pour la fréquence d'images du videoWriter, il est censé accepter un double / float, mais cela ne fonctionne que lorsque le chiffre juste après la virgule décimale est supérieur ou égal à 5, sinon il sera arrondi à un entier (par exemple, cela fonctionne pour 25,5 mais il s'arrondira à 25 lorsque vous passerez en 25,4).

Voici deux exemples dans lesquels j'enregistre simplement des vidéos de 50 images à partir de la caméra et affiche la fréquence d'images des vidéos enregistrées pour démontrer le problème:

import cv2


fourcc = cv2.VideoWriter_fourcc(*'H264')


vw = cv2.VideoWriter()
vw.open('test2.avi', fourcc, 25.6, (640, 480))

camera = cv2.VideoCapture(0)

for f in range(50):
    _, frame = camera.read()
    vw.write(frame)

vw.release()
c = cv2.VideoCapture('test2.avi')
print(c.get(cv2.CAP_PROP_FPS))

Sortie: 25,6

import cv2


fourcc = cv2.VideoWriter_fourcc(*'H264')


vw = cv2.VideoWriter()
vw.open('test2.avi', fourcc, 25.4, (640, 480))

camera = cv2.VideoCapture(0)

for f in range(50):
    _, frame = camera.read()
    vw.write(frame)

vw.release()
c = cv2.VideoCapture('test2.avi')
print(c.get(cv2.CAP_PROP_FPS))

Sortie: 25,0

bug videoio

Commentaire le plus utile

Bonjour à tous,

Je pense que j'ai trouvé le problème autour de cela. Sur le wrapper ffmpeg, il y a une petite faute de frappe dans l'arrondi de la fréquence d'images.

Vous pouvez trouver deux exemples de ceci dans: https://github.com/opencv/opencv/blob/master/modules/videoio/src/cap_ffmpeg_impl.hpp#L1544 et https://github.com/opencv/opencv/blob /master/modules/videoio/src/cap_ffmpeg_impl.hpp#L2377

Avant que

while (fabs((double)frame_rate/frame_rate_base) - fps > 0.001){

Après

while (fabs(((double)frame_rate/frame_rate_base) - fps) > 0.001){

En utilisant fps=59.15 , avant le changement, vous obtenez frame_rate=59 et frame_rate_base=1 , après vous pouvez obtenir frame_rate=5915 et frame_rate_base=100 .

J'ai du mal à le tester sur mon ordinateur (basé sur Windows) car le wrapper est pré-construit en tant que composant tiers et les instructions de construction ne sont pas très claires sur cette partie. C'est pourquoi je ne crée pas déjà un PR. Dites-moi si je peux vous aider.

Tous les 3 commentaires

Bonjour à tous,

Je pense que j'ai trouvé le problème autour de cela. Sur le wrapper ffmpeg, il y a une petite faute de frappe dans l'arrondi de la fréquence d'images.

Vous pouvez trouver deux exemples de ceci dans: https://github.com/opencv/opencv/blob/master/modules/videoio/src/cap_ffmpeg_impl.hpp#L1544 et https://github.com/opencv/opencv/blob /master/modules/videoio/src/cap_ffmpeg_impl.hpp#L2377

Avant que

while (fabs((double)frame_rate/frame_rate_base) - fps > 0.001){

Après

while (fabs(((double)frame_rate/frame_rate_base) - fps) > 0.001){

En utilisant fps=59.15 , avant le changement, vous obtenez frame_rate=59 et frame_rate_base=1 , après vous pouvez obtenir frame_rate=5915 et frame_rate_base=100 .

J'ai du mal à le tester sur mon ordinateur (basé sur Windows) car le wrapper est pré-construit en tant que composant tiers et les instructions de construction ne sont pas très claires sur cette partie. C'est pourquoi je ne crée pas déjà un PR. Dites-moi si je peux vous aider.

@WydD Belle prise! N'hésitez pas à ouvrir PR sur la branche 3.4. Il sera testé sur OpenCV CI.

@alalek Merci pour la réponse rapide. Le PR a été créé.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

opencv-pushbot picture opencv-pushbot  ·  3Commentaires

praneethsusarla picture praneethsusarla  ·  3Commentaires

sturkmen72 picture sturkmen72  ·  3Commentaires

opencv-pushbot picture opencv-pushbot  ·  3Commentaires

dpo picture dpo  ·  3Commentaires