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:
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.
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
@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
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();
}
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()
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()