47

我想从我的网络摄像头捕获单个图像并将其保存到磁盘。我想用 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 在 Linux 上获得 Froyo 的 pygame 示例。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 的解决方案。

4

7 回答 7

80

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

使用SimpleCV(在 python3.x 中不支持):

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_cameras() #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
于 2012-06-19T05:29:54.693 回答
20

在 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-在 Linux 上

于 2012-06-19T05:08:17.573 回答
7
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()
于 2016-06-01T12:34:20.300 回答
6

前段时间我写了简单的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();
}
于 2013-11-15T20:18:58.287 回答
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()
于 2019-01-07T15:02:01.637 回答
2

可以通过使用 ecapture 来完成 首先,运行

pip install ecapture

然后在一个新的python脚本类型中:

    from ecapture import ecapture as ec

    ec.capture(0,"test","img.jpg")

来自此链接的更多信息

于 2019-05-05T14:31:21.033 回答
0

我能够以这种方式在 Python(Windows 10)中实现它:

请安装PyAutoGUI

import pyautogui as pg #For taking screenshot
import time # For necessary delay
import subprocess 

# Launch Windows OS Camera
subprocess.run('start microsoft.windows.camera:', shell=True) 

time.sleep(2) # Required !
img=pg.screenshot() # Take screenshot using PyAutoGUI's function
time.sleep(2) # Required !
img.save(r"C:\Users\mrmay\OneDrive\Desktop\Selfie.PNG") # Save image screenshot at desired location on your computer

#Close the camera
subprocess.run('Taskkill /IM WindowsCamera.exe /F', shell=True) 
于 2021-09-22T10:37:13.397 回答