Захват одного изображения с моей веб-камеры в Java или Python
Я хочу захватить одно изображение из своей веб-камеры и сохранить его на диске. Я хочу сделать это в Java или Python (желательно Java). Я хочу что-то, что будет работать как на 64-битных Win7, так и на 32-битных Linux.
EDIT: я использую Python 3.x, а не 2.x
Потому что во всем остальном я вижу, что этот вопрос спрашивает, что людям удается запутаться, я хочу сказать несколько вещей явно:
- Я не хочу использовать Обработку
- Я не хочу использовать какой-либо другой язык, кроме указанных выше.
- Я хочу показать это изображение на своем экране любым способом, формой или формой
- Я не хочу отображать живой видеоролик с веб-камеры на своем экране или сохранять такой канал на свой жесткий диск.
- Java Media Framework слишком устарела. Не предлагайте это.
- Я бы предпочел не использовать JavaCV, но если мне абсолютно необходимо, я хочу точно знать, какие файлы из библиотеки OpenCV мне нужны, и как я могу использовать эти файлы, не включая всю библиотеку (и, желательно, не вставляя эти файлы в любой вид PATH. Все должно быть включено в один каталог)
- Я могу использовать Eclipse на 64-разрядном компьютере Win7, если это необходимо, но я также должен иметь возможность компилировать и использовать его на 32-разрядной Linux, а также
- Если вы думаете, что я мог бы или не мог бы знать что-то, связанное с этим предметом, в какой-либо форме или форме, пожалуйста, предположите, что я этого не знаю, и скажите мне
EDIT2: я смог получить пример Pyroame Froyo, работающий в 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.
Ответы
Ответ 1
В окнах легко взаимодействовать с веб-камерой с 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
Ответ 2
@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
Ответ 3
Некоторое время назад я написал простой API веб-камеры Capture, который можно использовать для этого. Проект доступен на 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();
}
Ответ 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()
Ответ 5
Я написал инструмент для захвата изображений с веб-камеры полностью на 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()
Ответ 6
Похоже, это не ваш предпочтительный метод, но вот как вы это делаете в python с openCV: Отображение фида веб-камеры с использованием OpenCV и Python
Ответ 7
Это можно сделать с помощью ecapture. Сначала запустите
pip install ecapture
Затем в новом скрипте Python введите:
from ecapture import ecapture as ec
ec.capture(0,"test","img.jpg")
Больше информации по этой ссылке