Biblioteca de Python para tomar imágenes de la cámara

Quiero obtener una sola imagen de una cámara (por ejemplo, una cámara web integrada en una computadora portátil) con Python.

Estoy buscando una biblioteca que haga esto posible en unas pocas líneas de código (no estoy buscando escribir un controlador de cámara ni nada por el estilo). La imagen debe estar en algún formato de mapa de bits estándar.

Por favor, también

  • enumerar los requisitos (por ejemplo, paquetes instalados, sistema operativo),
  • añadir un enlace a la documentación
Esta pregunta se migró a Recomendaciones de software . He editado su título para que se centre más en el tema aquí y eliminé dos requisitos que razonablemente no puede esperar que se cumplan aquí. Puede revertir la edición si no está de acuerdo.
Para todas las respuestas, tenga en cuenta stackoverflow.com/a/34687991/562769
Por favor indícanos tu sistema operativo: linux, mac, windows...

Respuestas (7)

SimpleCV

Instalación

En sistemas basados ​​en Debian:

sudo apt-get install python-opencv

Código

import time
from SimpleCV import Camera

cam = Camera()
time.sleep(0.1)  # If you don't wait, the image will be dark
img = cam.getImage()
img.save("simplecv.png")

Imagen CV simple

ingrese la descripción de la imagen aquí

Aunque la situación de iluminación no cambió, la imagen de Python es mucho más oscura. No estoy seguro de por qué ese es el caso.

Mi primera suposición es que la imagen de Python está escalada de 0 a 1, mientras que debería ser de 0 a 255.
@Dirk: ¿Tienes alguna idea de cómo solucionarlo?
Multiplique por 255, luego guárdelo como png :)
@Dirk: Este parece no ser el problema. Imprimí un solo píxel y mostró el valor RGBA con números enteros. Así que supongo que se usa un rango de 0..255. Sin embargo, no estoy seguro de por qué fue RGBA y no RGB.
Acabo de presentar un problema La imagen de la cámara es muy oscura para SimpleCV. A ver si saben como solucionarlo.

OpenCV

Instalación

En sistemas basados ​​en Debian:

sudo apt-get install python-opencv

Código

import time
import cv2
camera_port = 0
camera = cv2.VideoCapture(camera_port)
time.sleep(0.1)  # If you don't wait, the image will be dark
return_value, image = camera.read()
cv2.imwrite("opencv.png", image)
del(camera)  # so that others can use the camera as soon as possible
@PadraicCunningham Gracias, lo he agregado. ¿Sabes si el otro tiene/necesita algo similar?
cam.stop()en pygame

acabo de modificar el código @Martin Thoma.

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

para resolver el problema de la pantalla negra. espero que sea de ayuda gracias.

PyGame

Esta respuesta está parcialmente tomada de https://stackoverflow.com/a/11094891/562769 - ¡gracias Froyo !

Gracias a Phani por ayudarme a mejorarlo.

  • Requisitos:
    • Paquetes: pygame (no en PyPI)
    • Python 2.X (aunque no probado con 3)
    • SO: Funciona en Ubuntu
  • Documentación: http://www.pygame.org/docs/

Instalación

En sistemas basados ​​en Debian:

sudo apt-get install python-pygame

Código

import pygame
import pygame.camera
import time

pygame.camera.init()
pygame.camera.list_cameras()
cam = pygame.camera.Camera("/dev/video0", (640, 480))
cam.start()
time.sleep(0.1)  # You might need something higher in the beginning
img = cam.get_image()
pygame.image.save(img, "pygame.jpg")
cam.stop()
Será útil agregar un time.sleep(0.1)aquí también. De lo contrario, las imágenes son oscuras.
El sueño tiene que ser después cam.start(). Además, para mí 0.1no es suficiente en mi portátil Dell. 0.5trabajó para mi.
@Phani Muy interesante. Lo probé un par de veces y creo que 0.1 también era demasiado bajo para mi computadora. Sin embargo, después de ejecutar mi script un par de veces, no necesito la línea de código "dormir". Lo último que intenté fue poner el sueño entre cam = ...y cam.start(). Supuse (erróneamente) que tenía que estar allí, porque funcionó después de cambiar eso.
En Windows 7, py36, obtengo ImportError: cannot import name '_camera'.

ecaptura

Instalación

pip install ecapture 

Código

from ecapture import ecapture as ec

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

Cortaría este problema en dos partes.

  1. Tomar una foto desde la línea de comando

Espero que utilice un sistema operativo como Linux que tiene una línea de comandos.
AFAIK gphoto2 puede hacer algo como esto

  1. Usar el módulo de subproceso de Python

    subprocess.call(['tutambién', 'arg1, ...])

Para resolver el problema de la pantalla negra, deje que la cámara se caliente.

import time 
import cv2
camera_port = 0
camera = cv2.VideoCapture(camera_port)
time.sleep(0.1)
return_value, image = camera.read()
cv2.imwrite("opencv.jpg", image)
del(camera)  # so that others can use the camera as soon as possible
Que es exactamente lo que escribí en el comentario de arriba hace 2 meses. Si cree que debería ser una respuesta, al menos debería convertirla en una respuesta wiki comunitaria.