Захват одного изображения с веб-камеры на Java или Python

Я хочу, чтобы захватить одно изображение с веб-камеры и сохранить его на диск. Я хочу сделать это на Java или Python (предпочтительно Java). Я хочу что-то, что будет работать как на 64-битном Win7, так и на 32-битном Linux.

EDIT: я использую Python 3.x, а не 2.x

поскольку везде, где я вижу этот вопрос, люди умудряются запутаться, я собираюсь заявить несколько вещей явно:

  • Я не хочу использовать обработку
  • Я не хочу использовать любой язык, отличный от указанных выше
  • Я хочу отобразить это изображение на моем экране любым способом, формой или формой
  • Я не хочу отображать прямую трансляцию видео с моей веб-камеры на моем экране или сохранять такую ленту на мой жесткий диск
  • Java Media Framework слишком устарел. Не предлагай этого.
  • Я бы предпочел не использовать JavaCV, но если я абсолютно должен, я хочу точно знать, какие файлы из библиотеки OpenCV мне нужны, и как я могу их использовать файлы без включения всей библиотеки (и желательно без вставления этих файлов в какой-либо путь. Все должно быть включено в один каталог)
  • Я могу использовать Eclipse на 64-битном компьютере Win7, если нужно, но я также должен иметь возможность компилировать и использовать его на 32-битном Linux, а также
  • если вы думаете, что я могу или не могу знать что-то, связанное с этим предметом в какой-либо форме или форме, пожалуйста, предположите, что я этого не знаю, и скажите мне

EDIT2: я смог получить пример pygame Froyo, работающий на Linux, используя Python 2.7 и pygame 1.9.1. в которым Pygame.камера.вызов camera_list () не работал, но это было ненужным для остальной части примера. Однако мне пришлось позвонить Кэму.set_controls () (для которого вы можете найти документацию здесьhttp://www.pygame.org/docs/ref/camera.html), чтобы увеличить яркость, чтобы я мог видеть что-либо на изображении, которое я захватил.

Кроме Того, I нужно позвонить в камеру.get_image () и pygame.изображение.методы save () три раза, прежде чем изображение, которое я предположительно взял на первую пару вызовов, фактически будет сохранено. Казалось, они застряли в странном буфере. В основном, вместо того, чтобы звонить Кэму.get_image () однажды мне пришлось вызывать его три раза каждый раз, когда я хотел захватить изображение. Тогда и только тогда я позвонил в pygame.изображение.спасать.)(

к сожалению, как указано ниже, pygame.камера поддерживается только в Linux. У меня все еще нет решение для Windows.

4 ответов


в windows легко взаимодействовать с веб-камерой с pygame:

from VideoCapture import Device
cam = Device()
cam.saveSnapshot('image.jpg')

Я не пробовал использовать pygame на linux (все мои Linux boxen-это серверы без X), но эта ссылка может быть полезнаhttp://www.jperla.com/blog/post/capturing-frames-from-a-webcam-on-linux


@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

некоторое время назад я написал simple 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();
}

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()