it-swarm.com.ru

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

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

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

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

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

Правка 2: Я смог получить пример Froyo Pygame, работающий на Linux, используя Python 2.7 и Pygame 1.9.1. вызов 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.

30
Matthew G

В Windows легко взаимодействовать с вашей веб-камерой с помощью Pygame:

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

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

15
thebjorn

@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
61
Froyo

Некоторое время назад я написал простой 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();
}
6
Bartosz Firyn
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()
3
ShivaGuntuku

Я написал инструмент для захвата изображений с веб-камеры полностью на Python, основанный на DirectShow. Вы можете найти его здесь: https://github.com/andreaschiavinato/python_grabber

Вы можете использовать все приложение или только класс FilterGraph в dshow_graph.py следующим образом:

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()
1
Andrea S.