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

Posted

技术标签:

【中文标题】使用 Java 或 Python 从我的网络摄像头捕获单个图像【英文标题】:Capturing a single image from my webcam in Java or Python 【发布时间】:2012-06-21 02:37:41 【问题描述】:

我想从我的网络摄像头捕获一张图像并将其保存到磁盘。我想用 Java 或 Python(最好是 Java)来做这件事。我想要可以在 64 位 Win7 和 32 位 Linux 上运行的东西。

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

因为我在其他任何地方看到这个问题被问到人们都会感到困惑,所以我将明确说明一些事情:

我不想使用处理 我不想使用上述以外的任何语言 我确实想以任何方式、形状或形式在我的屏幕上显示此图像 我不想在我的屏幕上显示来自我的网络摄像头的实时视频源,或者将此类源保存到我的硬盘驱动器中 Java 媒体框架已经过时了。不建议这样做。 我宁愿不使用 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() 方法 3 次,然后我应该在第一对调用中获取的图像实际被保存。他们似乎被困在一个奇怪的缓冲区中。基本上,每次我想捕获图像时,我都不得不调用它三次,而不是调用一次 cam.get_image()。然后我才调用 pygame.image.save()。

不幸的是,如下所述,pygame.camera 仅在 Linux 上受支持。我仍然没有适用于 Windows 的解决方案。

【问题讨论】:

在处理现实世界时,您始终需要处理缓冲区和时间问题(包括捕获设备,例如 ***.com/questions/5595658/python-video-capture-loop )。即使是简单的开/关开关也存在这些问题(请参阅labbookpages.co.uk/electronics/debounce.html 以获取有关硬件和软件解决方案的更深入解释)。 本页的内容能否回答您的问题? How to use JavaCV in an applet 另见:How can I take camera images with Python? 【参考方案1】:

@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

【讨论】:

SimpleCV 不支持 python 3.x。 OpenCV 是巨大的。如果你愿意,你可以使用 pygame。你可以使用 PIL,但它也不支持 python 3.x ***.com/questions/3896286/image-library-for-python-3 PIL for python 3.x 另外,pygame.camera 只支持 Linux。目前没有任何 Windows 支持。 pygame.camera 在 Windows 上使用 pygame-1.9.2pre 中的 VideoCapture 模块。见bitbucket.org/pygame/pygame/src/11d40f67485c/lib/… 这是pygame.camera.list_cameras(),而不是pygame.camera.list_camera()【参考方案2】:

在 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

【讨论】:

我以前从未使用过 pygame。我已经从这里pygame.org/download.shtml 下载了 pygame-1.9.2a0.win32-py3.2.msi 文件并安装了它,然后尝试在 Python shell 中运行你的代码,但它并没有产生任何与我之前不同的东西安装了pygame。我的意思不是听起来很苛刻,但请不要假设对你来说容易的事情对我来说很容易。我需要小步,因为我对自己要做什么几乎一无所知。 另外,VideoCapture 不支持 python-3.2 @cgohlke 这个页面已经救了我好几次了! @MatthewG 您应该在 VideoCapture 的示例文件夹中查找可运行的示例,并阅读(迷幻色彩的)文档:videocapture.sourceforge.net/html/VideoCapture.html【参考方案3】:
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()

【讨论】:

如何安装 cv2? @Benoit.B.Mandelbrot 安装 opencv 版本 2 或更高版本。按照这个 url 在 Linux 环境中安装 docs.opencv.org/2.4/doc/tutorials/introduction/linux_install/… 你能解释一下if cv2.waitKey(1)& 0xFF == ord('s'):的作用吗? 这意味着如果 Ctl^S 被按下。我想 waitkey(1) 是 Ctl 按钮(在 Mac 中是命令键),而 ord('s') 代表“s”字符的值。【参考方案4】:

前段时间我写了简单的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();

【讨论】:

【参考方案5】:

我编写了一个工具来从网络摄像头中捕获图像,完全是在 Python 中,基于 DirectShow。你可以在这里找到它: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()

【讨论】:

感谢您的反馈。我添加了一个示例代码,但我无法将FilterGraph类的所有代码复制到这里,因为它很长。然而,现在答案看起来像是来自 Bartosz Firyn 的答案。【参考方案6】:

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

pip install ecapture

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

    from ecapture import ecapture as ec

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

更多信息来自link

【讨论】:

【参考方案7】:

我可以在 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) 

【讨论】:

在我的 Windows 10 上,它是唯一无需安装外部组件即可工作的选择。虽然我的 Python 3.9 需要导入子流程:import subprocess.

以上是关于使用 Java 或 Python 从我的网络摄像头捕获单个图像的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Html5 从我的网络摄像头播放视频? [关闭]

使用 Python/Linux 读取网络摄像头的选项

使用 OpenCV 和 Python 显示网络摄像头源

我怎么可能使用从我的网络摄像头生成的帧作为我的 Keras 模型的输入?

Python3 以网络摄像头 fps 处理和显示网络摄像头流

python OpenCV分段故障(核心转储)