IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Enregistrement video avec OpenCV [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2020
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2020
    Messages : 40
    Par défaut Enregistrement video avec OpenCV
    Bonjour,

    Voila quelques jours que je cherche désespérément une solution concernant l'enregistrement de video avec OpenCV.
    Mon problème:
    Afficher et enregistrer fonctionne correctement et je penses avoir compris les bases. J'ai codé avec différent exemples un programme permettant d'enregistrer le flux quand une détection de mouvement se fait.
    Mon souci et que je n'arrive pas à créer un nouveau fichier video après chaque détection.
    En gros j'aimerai que ça enregistre pendant le mouvement, ensuite s’arrête, puis créer un nouveau fichier avec la détection du nouveau mouvement.
    le résultat que j'ai est un seul fichier avec toutes les séquences enregistrées à la suite.

    Bref, si quelqu'un à une suggestion de référence que je pourrais lire afin de trouver ma solution.

    merci d'avance pour votre aide.

    Fred.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 739
    Par défaut
    Salut,

    Donc la question se résumerait à créer un nouveau fichier... ce qui se ramène à fabriquer les chaines de caractères fichier1.xyz, fichier2.xyz,... à partir d'un entier et d'un format de chaîne de caractères ou avec l'opérateur de concaténation ('+').

    Plutôt basique...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2020
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2020
    Messages : 40
    Par défaut
    Merci pour ta réponse toujours rapide !!!

    alors j'y ai bien pensé sauf que je me perds un peu...

    Dans le code de la méthode run() ci-dessous ou je détecte et enregistre, mon fichier est créer dans out = cv2.VideoWriter(.... et les frames sont intégrer plus bas à out.write(frame) si j'ai bien compris. Donc en fonction de ce que tu me dis il faudrait que mon filename sois incrémenté dans la boucle et comme cela il serait enregistré dans autre fichier ? j'ai essayé cela mais il faudrait "clôturer" le fichier pour pouvoir créer un autre out = cv2.VideoWriter .... c'est ça ?? et si oui bah la je flanche car j'ai essayé plein de manière et aucune ne fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
        def run(self):
            # Init opencv
            self.Capture = cv2.VideoCapture(0)
            fourcc = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
            out = cv2.VideoWriter(f'{basedir}/tmp/video/output_{datetime.now().strftime("%A_%d_%B_%Y_%I_%M_%S")}.avi',
                                  fourcc, 20, (640, 480))
     
            # Init image reference
            ret, prevFrame = self.Capture.read()
            self.prevFrame = self.grayScale(prevFrame)
            motionFrames = 0
            noMotionFrames = 0
            self.recording = False
     
            # Send slot of size video
            self.VideoSize.emit([self.Capture.get(3), self.Capture.get(4)])
     
            while self.is_running:
                self.ret, self.frame = self.Capture.read()
     
                self.gray = self.grayScale(self.frame)
                blurred = cv2.GaussianBlur(self.gray, (21, 21), 0)
     
                if self.firstFrame is None:
                    self.firstFrame = blurred
                    continue
     
                frameDelta = cv2.absdiff(self.prevFrame, blurred)
                thresh = cv2.threshold(frameDelta, 5, 255, cv2.THRESH_BINARY)[1]
                self.prevFrame = blurred
     
                thresh = cv2.dilate(thresh, None, iterations=3)
                contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
     
                self.motionStatus = "Not Moving"
     
                for c in contours:
     
                    if cv2.contourArea(c) < detect_value:  # value change size of detection
                        continue
     
                    (x, y, w, h) = cv2.boundingRect(c)
                    cv2.rectangle(self.frame, (x, y), (x + w, y + h), (0, 255, 0), 1)
     
                    self.motionStatus = "Moving"
                    # padding = 10
                    # cv2.rectangle(self.frame, (x - padding, y - padding), (x + w + padding, y + h + padding), (0, 255, 0),
                    #               1)
     
                cv2.putText(self.frame, "Ferret Status: {}".format(self.motionStatus), (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5,
                            (0, 0, 255), 1)
                cv2.putText(self.frame, datetime.now().strftime("%A %d %B %Y %I:%M:%S"), (10, self.frame.shape[0] - 10),
                            cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1)
     
                if self.motionStatus == "Moving":
                    motionFrames += 1
                    noMotionFrames = 0
                    if motionFrames > 10:
                        self.recording = True
                else:
                    noMotionFrames += 1
                    motionFrames = 0
                    if noMotionFrames > 10:
                        self.recording = False
     
                if self.recording:
                    out.write(self.frame)
     
                if self.ret:
                    Image = cv2.cvtColor(self.frame, cv2.COLOR_BGR2RGB)
                    FlippedImage = cv2.flip(Image, 1)
                    ConvertToQtFormat = QImage(FlippedImage.data, FlippedImage.shape[1], FlippedImage.shape[0],
                                               QImage.Format.Format_RGB888)
                    Pic = ConvertToQtFormat.scaled(640, 480, Qt.AspectRatioMode.KeepAspectRatio)
                    self.ImageUpdate.emit(Pic)

  4. #4
    Invité
    Invité(e)
    Par défaut
    Salut !

    Tu as essayé un truc aussi évident que ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                if self.motionStatus == "Moving":
                    if not motionFrames:
                        out = cv2.VideoWriter(f'{basedir}/tmp/video/output_{datetime.now().strftime("%A_%d_%B_%Y_%I_%M_%S")}.avi',
                                  fourcc, 20, (640, 480))
                    motionFrames += 1
                    noMotionFrames = 0
                    if motionFrames > 10:
                        self.recording = True
    Bon courage dans ton projet ! =)

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour

    je ne connais pas ta librairie pour enregistrer (donc rien compris au code) mais il me semble que tu utilises Qt ? et ton run est celui d'un thread ?
    Je pense que ton problème vient que tu écris "tout" dans une seule méthode

    - le nom du fichier peut-être dans ton objet et non dans ta méthode
    Plutot envoyer des signaux.
    un signal start_enreg() va
    - stoppé celui en cours si existe (signal "stop_enreg" , utilisé ici par start_enreg, ou par un bouton ou fermeture de l'application)
    - créer un nouveau nom depuis now()
    - lancer un nouveau process enregistrement (sans doute que le nouveau nom va être créer ici)

  6. #6
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2020
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2020
    Messages : 40
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Salut !

    Tu as essayé un truc aussi évident que ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                if self.motionStatus == "Moving":
                    if not motionFrames:
                        out = cv2.VideoWriter(f'{basedir}/tmp/video/output_{datetime.now().strftime("%A_%d_%B_%Y_%I_%M_%S")}.avi',
                                  fourcc, 20, (640, 480))
                    motionFrames += 1
                    noMotionFrames = 0
                    if motionFrames > 10:
                        self.recording = True
    Bon courage dans ton projet ! =)
    Merci infiniment LeNavarlo !!!

    J'ai essayé ton code mais cela enregistre tout le temps.... mais ça m'a fait comprendre quelque chose et oui en faite c'était super simple ...
    Voila ce que j'ai corrigé et maintenant tout fonctionne !! le seul souci c'est quand le mouvement s’arrête et reprend très vite il me créer un nouveau fichier mais c'est pas grave cela vient de ma détection qu'il faut que j'affine..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
                if self.motionStatus == "Moving":
                    self.recording = True
                    if motionFrames == 0:
                        out = cv2.VideoWriter(
                            f'{basedir}/static/tmp/video/output_{datetime.now().strftime("%A_%d_%B_%Y_%I_%M_%S")}.avi',
                            fourcc, 20, (640, 480))
                    motionFrames += 1
                else:
                    self.recording = False
                    motionFrames = 0
     
                if self.recording:
                    out.write(self.frame)
    Encore merci à tous pour votre aide !!!

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 739
    Par défaut
    Citation Envoyé par Fred973 Voir le message
    Donc en fonction de ce que tu me dis il faudrait que mon filename sois incrémenté dans la boucle et comme cela il serait enregistré dans autre fichier ?
    Ce code ne détecte pas les mouvements (côté caméra): il semble se contenter d'enregistrer ce que la caméra envoie en triant ce qui bouge.
    A partir de là, difficile de savoir quand fermer le fichier (et en ouvrir un autre) sans retravailler la logique (si c'est la caméra qui détecte les mouvements).
    note: si la détection se faisait en "amont" (pour lancer le thread qui exécute le "run"), çà ouvrirait un fichier différent à chaque appel.

    Reste à trouver comment construire une solution qui marche (pour çà il faut avoir une caméra semblable ou aller chercher un code adapté sur Internet).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2020
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2020
    Messages : 40
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Ce code ne détecte pas les mouvements (côté caméra): il semble se contenter d'enregistrer ce que la caméra envoie en triant ce qui bouge.
    A partir de là, difficile de savoir quand fermer le fichier (et en ouvrir un autre) sans retravailler la logique (si c'est la caméra qui détecte les mouvements).
    note: si la détection se faisait en "amont" (pour lancer le thread qui exécute le "run"), çà ouvrirait un fichier différent à chaque appel.

    Reste à trouver comment construire une solution qui marche (pour çà il faut avoir une caméra semblable ou aller chercher un code adapté sur Internet).

    - W
    Je comprends ce que tu veux dire je vais voir à améliorer ce code afin d'éviter ce problème en mettant la détection en "amont" effectivement. J'ai codé comme cela pour le moment afin de faire des tests donc j'ai tout mis dans la boucle du thread. Cependant je veux pouvoir regarder aussi en même temps et j'ai remarquer, ce qui est logique, que si tu requiert plus d'une fois le flux " flux = cv2.VideoCapture(0)" bah ç a plante.

    Bref merci encore pour toutes ces astuces qui vont me faire bcp avancer.

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 739
    Par défaut
    Citation Envoyé par Fred973 Voir le message
    Je comprends ce que tu veux dire je vais voir à améliorer ce code afin d'éviter ce problème en mettant la détection en "amont" effectivement.
    Il faut ajouter du hardware pour avoir une détection de mouvement: la caméra seule ne suffira pas.
    note: au prix modique de ces gadgets, il y a de quoi s'amuser.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Invité
    Invité(e)
    Par défaut
    Ravi d'avoir été utile

    Tu nous donneras des news de ton projet, il à l'air sympa, ça fait longtemps que je veux faire une petite caméra de surveillance mais les prix dérisoires sur internet des caméras connectées m'a découragé...

  11. #11
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2020
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2020
    Messages : 40
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Ravi d'avoir été utile

    Tu nous donneras des news de ton projet, il à l'air sympa, ça fait longtemps que je veux faire une petite caméra de surveillance mais les prix dérisoires sur internet des caméras connectées m'a découragé...
    Dérisoire ?!? je comprends pas tu veux dire trop cher ?

    Tu dois connaitre les ESP32 Cam ....???

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. enregistrement, probleme avec les relations
    Par Nelmo dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 27/04/2006, 17h23
  2. [FLASH] Video avec touche Lecture/Stop
    Par yanng dans le forum Flash
    Réponses: 1
    Dernier message: 17/03/2006, 09h43
  3. Fenêtre Enregistrer sous avec TWebBrowser
    Par Chriss dans le forum Composants VCL
    Réponses: 2
    Dernier message: 15/03/2006, 21h01
  4. Capture video avec AVICAP32.dll
    Par Mercenary Developer dans le forum Langage
    Réponses: 10
    Dernier message: 08/09/2005, 00h30
  5. Juxtaposition/Synchro de 2 videos avec DirectShow
    Par kioeev dans le forum DirectX
    Réponses: 18
    Dernier message: 21/04/2005, 20h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo