我想从网络摄像头捕获单个图像并将其保存到磁盘。我想用Java或Python(最好是Java)来做这件事。我想要一些适用于64位Win7和32位Linux的东西。
编辑:我使用的是Python 3.x,而不是2.x
因为在其他任何地方我都看到这个问题让人们感到困惑,我将明确陈述一些事情:
EDIT2:我能够使用Python 2.7和pygame 1.9.1让Froyo的pygame示例在Linux上运行。 pygame.camera.camera_list()调用不起作用,但对于示例的其余部分则没有必要。但是,我必须调用cam.set_controls()(你可以在这里找到文档http://www.pygame.org/docs/ref/camera.html)来提高亮度,这样我才能真实地看到我捕获的图像中的任何内容。
另外,我需要调用cam.get_image()和pygame.image.save()方法三次,然后我认为第一对调用的图像实际上被保存了。他们似乎陷入了一个奇怪的缓冲区。基本上,我不是一次调用cam.get_image(),而是每次想要捕获图像时都要调用它三次。然后我才调用pygame.image.save()。
不幸的是,如下所述,pygame.camera仅在Linux上受支持。我仍然没有Windows的解决方案。
答案 0 :(得分:63)
使用 SimpleCV :
from SimpleCV import Image, Camera
cam = Camera()
img = cam.getImage()
img.save("filename.jpg")
使用 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
使用 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")
安装 OpenCV :
install python-opencv bindings, numpy
安装 SimpleCV :
install python-opencv, pygame, numpy, scipy, simplecv
获取SimpleCV
的最新版本安装 pygame :
install pygame
答案 1 :(得分:16)
在Windows上,您可以使用pygame轻松与网络摄像头进行互动:
from VideoCapture import Device
cam = Device()
cam.saveSnapshot('image.jpg')
我没有尝试在linux上使用pygame(我所有的linux boxen都是没有X的服务器),但这个链接可能会有所帮助http://www.jperla.com/blog/post/capturing-frames-from-a-webcam-on-linux
答案 2 :(得分:7)
前段时间我编写了简单的Webcam Capture API,可用于此。该项目可在Github上获得。
示例代码:
Webcam webcam = Webcam.getDefault();
webcam.open();
try {
ImageIO.write(webcam.getImage(), "PNG", new File("test.png"));
} catch (IOException e) {
e.printStackTrace();
} finally {
webcam.close();
}
答案 3 :(得分:4)
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()
答案 4 :(得分:2)
我写了一个基于DirectShow的工具,可以完全使用Python从网络摄像头捕获图像。您可以在这里找到它:https://github.com/andreaschiavinato/python_grabber。
您可以通过以下方式使用整个应用程序或dshow_graph.py中的类FilterGraph:
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()
答案 5 :(得分:0)
这可以通过使用捕获来完成 首先,运行
pip install ecapture
然后使用新的python脚本 类型:
from ecapture import ecapture as ec
ec.capture(0,"test","img.jpg")
更多信息link