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
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éé.
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
Après
En utilisant
fps=59.15
, avant le changement, vous obtenezframe_rate=59
etframe_rate_base=1
, après vous pouvez obtenirframe_rate=5915
etframe_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.