使用Java或Python从我的网络摄像头捕获单个图像

时间:2012-06-19 04:40:53

标签: java python webcam image-capture javacv

我想从网络摄像头捕获单个图像并将其保存到磁盘。我想用Java或Python(最好是Java)来做这件事。我想要一些适用于64位Win7和32位Linux的东西。

编辑:我使用的是Python 3.x,而不是2.x

因为在其他任何地方我都看到这个问题让人们感到困惑,我将明确陈述一些事情:

  • 我不想使用处理
  • 我不想使用除上述语言之外的任何语言
  • 我想以任何方式,形状或形式在屏幕上显示此图像
  • 我不想在屏幕上显示网络摄像头的实时视频,或者将此类信息保存到我的硬盘
  • Java Media Framework太过时了。不建议。
  • 我宁愿不使用JavaCV,但如果我绝对必须,我想确切地知道我需要OpenCV库中的哪些文件,以及如何在不包含整个库的情况下使用这些文件(最好不要将这些文件放在任何类型的PATH。一切都应该包含在一个目录中)
  • 如果需要,我可以在64位Win7计算机上使用Eclipse,但我也必须能够在32位Linux上编译和使用它
  • 如果您认为我可能会或可能不会以任何形式或形式了解与此主题相关的内容,请假设我不知道,并告诉我

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的解决方案。

6 个答案:

答案 0 :(得分:63)

@thebjorn给出了一个很好的答案。但是如果你想要更多选项,可以试试OpenCV,SimpleCV。

使用 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