La lecture de chaque nième trame de VideoCapture dans OpenCV
Est-il possible de lire des images d'une vidéo dans les étapes (par exemple, je veux lire chaque cinquième image d'un flux vidéo). Actuellement, je suis en train de faire cela comme une solution de contournement, mais ce n'est pas très efficace.
bool bSuccess
int FramesSkipped = 5;
for (int a = 0; < FramesSkipped; a++)
bSuccess = cap.read(NextFrameBGR);
Des suggestions donc je n'ai pas de boucle à travers les cinq images pour obtenir l'image souhaitée?
OriginalL'auteur user3079474 | 2014-03-28
Vous devez vous connecter pour publier un commentaire.
J'ai peur, il n'y a pas beaucoup que vous pouvez faire et ce n'est pas seulement une lacune de OpenCV. Vous voyez, moderne codecs vidéo, sont, en général, des choses complexes. Pour obtenir un taux de compression supérieur de l'encodage d'une image est souvent dépendante de la précédente et parfois même des images successives.
Donc, la plupart du temps que vous avez à décoder des images avant de le désirer, même si vous n'en avez pas besoin.
Il y a plutôt de la non-trivial astuces spécifiquement pour encoder un fichier vidéo, de sorte qu'il serait bon marché d'obtenir chaque Nième image, mais il n'est pas possible dans le cas général.
Cela dit, vous pouvez essayer la fonctionnalité de recherche d'OpenCV (voir la OpenCV Fonction De Recherche/De Rembobinage). Il peut (ainsi que ne peut pas) travailler plus vite, selon les circonstances. Cependant, personnellement, je ne voudrais pas parier sur elle.
Probablement, il fait quelque chose comme ceci avec le mentionné fonctions liées à la recherche. Mais je ne pense pas qu'il y a une API dans OpenCV pour ces fines opération sur le codec.
je vous remercie. J'ai finalement choisi d'utiliser ffmpeg pour extraire des images clés. Constaté qu'aucune des image extraite de opencv avait que de la bonne qualité de ffmpeg.
OriginalL'auteur Sergei Nosov
Je l'ai eu à travailler en Python... Voir ci-dessous deux exemples de cas d'utilisation et quelques mises en garde.
D'abord, l'importation de certains paquets
Capture toutes les n secondes (ici, n = 5)
Sinon, capture toutes les n images (ici, n = 10)
C'est assez bien.
Certains unfortunante mises en garde...selon votre version d'opencv (ce qui est construit pour opencv V3), vous devrez peut-être régler le fps variable différemment. Voir ici pour plus de détails. Pour connaître votre version, vous pouvez effectuer les opérations suivantes:
cv2.CAP_PROP_FRAME_COUNT
pour avoir exactement le nombre d'images et d'éviter calucalting. Aussi, pouvez-vous expliquer le but den * np.arange(est_tot_frames)
? Il ne semble pas faire ce qu'il est censé le faire.Bien qu'il soit utile à arriver à une solution, cette réponse n'est pas obtenir à la question concernant la nième images.
Ce sera très lent! Mauvaise Idée
OriginalL'auteur Afflatus
Voici ce que je propose:
Maintenant que vous avez enregistré toutes les images localement, vous pouvez rapidement lire la nième image que vous souhaitez.
CATUION:UN exemple de vidéo de 12 secondes, j'ai eu était composée de >200 images. Cela permettra de manger beaucoup d'espace.
Un moyen simple mais efficace d'optimisation sera de lire la nième trame à l'aide de l'approche que vous utilisez ou celui proposé par @sergie. Après cela, vous pouvez enregistrer l'image et son indice de référence de sorte que plus tard requête au même indice sera de retour l'enregistrement de l'image plutôt que de devoir sauter des images comme vous êtes. De cette façon, vous permettra d'économiser de l'espace que vous avez perdu dans la sauvegarde des images que vous n'auriez pas interrogé et a pris le temps de lire & enregistrer ces indésirables cadres aswell.
OriginalL'auteur Deepthought
J'ai eu du succès en Python 3 à l'aide d'un simple compteur et le réglage de la capture pour que le compteur de l'image, comme suit:
J'ai essayé de trouver un moyen de rendre cela un peu plus pythonic à l'aide d'un
with
déclaration, mais je ne crois pas que le CV2 bibliothèque a été mise à jour.OriginalL'auteur benJephunneh
Quand j'ai eu le même objectif avec OpenCV, je viens de l'écoute à travers le nombre de "images clés" je voulais par seconde de la vidéo, indépendamment de la fréquence d'image ou le nombre total d'images. Donc, cela me met le N-ième clé donné ma cible KPS.
Remarque que je suis en roulant à travers toutes les images, mais seulement de l'écriture de la N-ième image à l'aide de
hop
que N.OriginalL'auteur azatar
J'ai rencontré le même problème.
J'ai tout ce:
Espère que cette aide.
OriginalL'auteur Ishan Shah
Il n'est pas possible d'extraire des images aléatoires comme le schéma de codage est généralement extrêmement complexe. Par exemple, dans MPEG-4, Seules les informations contenant la différence entre les deux images est stockée, Donc les images précédentes sont nécessaires.
OriginalL'auteur Dheeraj M Pai