Minuterie pour capturer des images de webcam avec OpenCV

Nous pouvons avoir besoin d'obtenir des images de la webcam pour de nombreuses raisons:

  • Pour calibrer votre caméra, vous devez prendre des instantanés de motifs avec votre caméra.
  • Obtenez des images de caméras en direct pour les étiqueter ensuite. (Pour former un modèle deep learning personnalisé.)
  • Pour créer un animation en volume après tout.

J'ai besoin de ce petit programme car je voulais faire un calibrage de caméra. Calibrage de la caméra sera un autre sujet mais, pour ce faire, vous avez besoin de nombreuses images de l'objet d'étalonnage. Tout d'abord, j'ai essayé de le faire manuellement, mais cela n'a pas fonctionné comme prévu. C'est le meilleur moyen de prendre des instantanés des cadres de l'appareil photo.

Avant tout, nous devons installer les packages nécessaires:

$ pip install imutils
$ pip install time
$ pip install argparse

Alors, créons un programme pour prendre des instantanés à partir des cadres de la caméra:

# importer les paquets nécessaires
import cv2
import time
import argparse
import imutils

time, pour calculer une durée différente entre les images.
argparse, pour analyseur pour les options de ligne de commande, les arguments et les sous-commandes.
imutils, pour faire du traitement d'image par exemple: redimensionnement.

Je voulais ajouter argparse pour rendre les tests plus rapides et plus faciles à utiliser à l'avenir.

# construire l'argument parser et analyser les arguments
ap = argparse.ArgumentParser()
ap.add_argument("-t", "--timer", required=False, default=5,
                help="fréquence de capture d'image", type=int)
ap.add_argument("-w", "--width", required=False, default=1200,
                help="largeur de l'image", type=int)
ap.add_argument("-d", "--duration", required=False, default=600,
                help="durée de l'action de capture en secondes", type=int)
args = vars(ap.parse_args())

--timer nous aidera à déterminer le décalage horaire entre 2 instantanés.
--width est la largeur de l'image de sortie en pixels. 
--duration correspond à la durée d'exécution du programme. Cela nous aidera à utiliser ce script sur une longue durée sans attendre devant l'ordinateur.

Commençons par définir nos variables et commencer à capturer des images de notre caméra:

img_counter = 0
timer = time.time()
start_time = time.time()
end_time = time.time()

capture = cv2.VideoCapture(0)

Vérifiez que la caméra est allumée et continuez nos conditions:

# Vérifier que la caméra fonctionne
if capture.isOpened():

    while True:
        # Capture frame par frame
        ret, frame = capture.read()
        frame = imutils.resize(frame, width=args["width"])

        # Afficher le cadre résultant
        cv2.imshow('frame', frame)
        # Si vous appuyez sur Q, quittez le script
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
        # Si la durée est dépassée pour une limite donnée, quittez le script
        if (end_time - start_time) >= args["duration"]:
            print('time is up')
            break
        if time.time() - timer >= args["timer"]:
            img_name = "images/frame_{}.png".format(img_counter)
            cv2.imwrite(img_name, frame)
            print("{} written!".format(img_counter))
            timer = time.time()
            end_time = time.time()
            print (end_time - start_time)
        img_counter += 1

    # Quand tout est fait, relâchez la capture
    capture.release()
    cv2.destroyAllWindows()

lorsque la caméra est allumée, nous capturons les images et afficher le cadre résultant. Si la différence de temps est supérieur à notre durée, le script continuera de s'exécuter et si le temps donné s'est écoulé depuis le dernier instantané, le script prendra un autre instantané.

Pour exécuter le script:

Enregistrez votre script avec le nom que vous souhaitez (exemple: save-images-from-camera.py). Créez le dossier "images" pour enregistrer les images dans le même répertoire.

$ mkdir images

Exécutez le script avec la ligne de commande suivante:

$ python save-images-from-camera.py --timer 5 --width 800 --duration 600

Cette ligne de commande prendra un instantané toutes les 5 secondes pour une durée de 600 secondes et les enregistrera sous forme d'images .PNG d'une largeur de 800 pixels.

Snapshot From Camera

Figure 1: prendre des instantanés de la caméra ou video avec OpenCV et python.

Résumé

Aujourd'hui, nous avons développé un script pour prendre des instantanés de la caméra. Nous pouvons retarder le temps entre les images, changer la largeur de l'image de sortie, et limiter le temps d'exécution du script..