Ich möchte ein einzelnes Bild von meiner Webcam aufnehmen und auf der Festplatte speichern. Ich möchte dies in Java oder Python (vorzugsweise Java) tun. Ich möchte etwas, das auf 64-Bit-Win7 und 32-Bit-Linux funktioniert.
BEARBEITEN: Ich verwende Python 3.x, nicht 2.x.
Da ich diese Frage überall dort sehe, wo es den Leuten gelingt, verwirrt zu werden, werde ich einige Dinge ausdrücklich erwähnen:
EDIT2: Ich konnte Froyos Pygame-Beispiel unter Linux mit Python 2.7 und Pygame 1.9.1 zum Laufen bringen. Der Aufruf von pygame.camera.camera_list () hat nicht funktioniert, war aber für den Rest des Beispiels nicht erforderlich. Ich musste jedoch cam.set_controls () aufrufen (die Dokumentation dazu finden Sie hier http://www.pygame.org/docs/ref/camera.html ), um die Helligkeit zu erhöhen, damit ich sie tatsächlich nutzen konnte Sieh irgendetwas in dem Bild, das ich aufgenommen habe.
Außerdem muss ich die Methoden cam.get_image () und pygame.image.save () dreimal aufrufen, bevor das Bild, das ich angeblich bei den ersten Aufrufen aufgenommen habe, tatsächlich gespeichert wird. Sie schienen in einem seltsamen Puffer zu stecken. Anstatt cam.get_image () einmal aufzurufen, musste ich es jedes Mal dreimal aufrufen, wenn ich ein Bild aufnehmen wollte. Dann und nur dann habe ich pygame.image.save () aufgerufen.
Leider wird pygame.camera, wie unten angegeben, nur unter Linux unterstützt. Ich habe noch keine Lösung für Windows.
Unter Windows ist es einfach, mit Pygame mit Ihrer Webcam zu interagieren:
from VideoCapture import Device
cam = Device()
cam.saveSnapshot('image.jpg')
Ich habe Pygame unter Linux noch nicht ausprobiert (alle meine Linux-Boxen sind Server ohne X), aber dieser Link könnte hilfreich sein http://www.jperla.com/blog/post/capturing-frames-from- a-webcam-on-linux
@thebjorn hat eine gute Antwort gegeben. Wenn Sie jedoch mehr Optionen wünschen, können Sie OpenCV oder SimpleCV ausprobieren.
mit SimpleCV:
from SimpleCV import Image, Camera
cam = Camera()
img = cam.getImage()
img.save("filename.jpg")
mit 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
mit 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")
Installiere OpenCV:
install python-opencv bindings, numpy
Installiere SimpleCV:
install python-opencv, pygame, numpy, scipy, simplecv
neueste Version von SimpleCV erhalten
Installiere pygame:
install pygame
Vor einiger Zeit habe ich einfache Webcam Capture API geschrieben, die dafür verwendet werden können. Das Projekt ist auf Github verfügbar.
Beispielcode:
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()
Ich habe ein Tool geschrieben, mit dem Bilder von einer Webcam vollständig in Python basierend auf DirectShow aufgenommen werden können. Sie finden es hier: https://github.com/andreaschiavinato/python_grabber .
Sie können die gesamte Anwendung oder nur die Klasse FilterGraph in dshow_graph.py folgendermaßen verwenden:
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()
Dies kann mithilfe von ecapture erfolgen. Führen Sie zuerst aus
pip install ecapture
Dann in einem neuen python Skripttyp:
from ecapture import ecapture as ec
ec.capture(0,"test","img.jpg")
Weitere Informationen hierzu Link