web-dev-qa-db-fra.com

Capturer une seule image de ma webcam en Java ou en Python

Je veux capturer une seule image à partir de ma webcam et la sauvegarder sur le disque. Je veux le faire en Java ou en Python (de préférence Java). Je veux quelque chose qui fonctionnera à la fois sur Win7 64 bits et Linux 32 bits.

EDIT: j'utilise Python 3.x, pas 2.x

Parce que partout ailleurs, je vois cette question posée, les gens parviennent à devenir confus, je vais énoncer quelques choses explicitement:

  • Je ne veux pas utiliser le traitement
  • Je ne souhaite utiliser aucune langue autre que celles mentionnées ci-dessus
  • Je souhaite afficher cette image sur mon écran de quelque manière que ce soit
  • Je ne souhaite pas afficher un flux vidéo en direct de ma webcam sur mon écran, ni enregistrer un tel flux sur mon disque dur.
  • Java Media Framework est beaucoup trop obsolète. Ne le suggérez pas.
  • Je préférerais ne pas utiliser JavaCV, mais si je le dois absolument, je veux savoir exactement quels fichiers de la bibliothèque OpenCV dont j'ai besoin, et comment je peux utiliser ces fichiers sans inclure la totalité de la bibliothèque (et de préférence sans coller ces fichiers PATH. Tout devrait être inclus dans le même répertoire)
  • Je peux utiliser Eclipse sur un ordinateur Win7 64 bits si besoin est, mais je dois aussi pouvoir le compiler et l'utiliser aussi sous Linux 32 bits
  • Si vous pensez que je sais ou non quelque chose qui a un rapport avec ce sujet, supposez que je ne le sache pas et dites-moi

EDIT2: L’exemple pygame de Froyo fonctionnait sous Linux avec Python 2.7 et 1.9.1. L'appel à pygame.camera.camera_list () n'a pas fonctionné, mais il n'a pas été nécessaire pour le reste de l'exemple. Cependant, je devais appeler cam.set_controls () (pour laquelle vous pouvez trouver la documentation ici http://www.pygame.org/docs/ref/camera.html ) afin d’augmenter la luminosité afin que je puisse réellement rien voir dans l'image que j'ai capturée.

De plus, je dois appeler les méthodes cam.get_image () et pygame.image.save () trois fois avant que l'image que j'ai supposément prise lors de la première paire d'appels soit réellement enregistrée. Ils semblaient être coincés dans un tampon étrange. En gros, au lieu d'appeler cam.get_image () une fois, je devais l'appeler trois fois à chaque fois que je voulais capturer une image. C’est alors que j’ai appelé pygame.image.save ().

Malheureusement, comme indiqué ci-dessous, pygame.camera n'est pris en charge que sous Linux. Je n'ai toujours pas de solution pour Windows.

30
Matthew G

Sur Windows, il est facile d’interagir avec votre webcam avec pygame:

from VideoCapture import Device
cam = Device()
cam.saveSnapshot('image.jpg')

Je n'ai pas essayé d'utiliser pygame sur linux (tous mes serveurs linux sont des serveurs sans X), mais ce lien pourrait être utile http://www.jperla.com/blog/post/capturing-frames-from-a -webcam-on-linux

15
thebjorn

@thebjorn a donné une bonne réponse. Mais si vous voulez plus d'options, vous pouvez essayer OpenCV, SimpleCV.

en utilisant SimpleCV:

from SimpleCV import Image, Camera

cam = Camera()
img = cam.getImage()
img.save("filename.jpg")

en utilisant OpenCV:

from cv2 import *
# initialize the camera
cam = VideoCapture(0)   # 0 -> index of camera
s, img = cam.read()
if s:    # frame captured without any errors
    namedWindow("cam-test",CV_WINDOW_AUTOSIZE)
    imshow("cam-test",img)
    waitKey(0)
    destroyWindow("cam-test")
    imwrite("filename.jpg",img) #save image

en utilisant pygame:

import pygame
import pygame.camera

pygame.camera.init()
pygame.camera.list_camera() #Camera detected or not
cam = pygame.camera.Camera("/dev/video0",(640,480))
cam.start()
img = cam.get_image()
pygame.image.save(img,"filename.jpg")

Installez OpenCV:

install python-opencv bindings, numpy

Installez SimpleCV:

install python-opencv, pygame, numpy, scipy, simplecv

obtenir la dernière version de SimpleCV

Installez pygame:

install pygame
61
Froyo

Il y a quelque temps, j'ai écrit un simple Webcam Capture API qui peut être utilisé pour cela. Le projet est disponible sur Github.

Exemple de code:

Webcam webcam = Webcam.getDefault();
webcam.open();
try {
  ImageIO.write(webcam.getImage(), "PNG", new File("test.png"));
} catch (IOException e) {
  e.printStackTrace();
} finally {
  webcam.close();
}
6
Bartosz Firyn
import cv2
camera = cv2.VideoCapture(0)
while True:
    return_value,image = camera.read()
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    cv2.imshow('image',gray)
    if cv2.waitKey(1)& 0xFF == ord('s'):
        cv2.imwrite('test.jpg',image)
        break
camera.release()
cv2.destroyAllWindows()
3
ShivaGuntuku

J'ai écrit un outil permettant de capturer des images d'une webcam entièrement en Python, basé sur DirectShow. Vous pouvez le trouver ici: https://github.com/andreaschiavinato/python_grabber

Vous pouvez utiliser toute l'application ou simplement la classe FilterGraph dans dshow_graph.py de la manière suivante:

from pygrabber.dshow_graph import FilterGraph
import numpy as np
from matplotlib.image import imsave

graph = FilterGraph()
print(graph.get_input_devices())
device_index = input("Enter device number: ")
graph.add_input_device(int(device_index))
graph.display_format_dialog()
filename = r"c:\temp\imm.png"
# np.flip(image, axis=2) required to convert image from BGR to RGB
graph.add_sample_grabber(lambda image : imsave(filename, np.flip(image, axis=2)))
graph.add_null_render()
graph.prepare()
graph.run()
x = input("Press key to grab photo")
graph.grab_frame()
x = input(f"File {filename} saved. Press key to end")
graph.stop()
1
Andrea S.