una - python webcam
Mostrar una fuente de webcam usando OpenCV y Python (6)
Al igual que en el opencv-doc , puede obtener la alimentación de video de una cámara que está conectada a su computadora siguiendo el código.
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
# Our operations on the frame come here
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Display the resulting frame
cv2.imshow(''frame'',gray)
if cv2.waitKey(1) & 0xFF == ord(''q''):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
Puede cambiar el índice cap = cv2.VideoCapture(0)
de 0
a 1
para acceder a la 2da cámara.
Probado en opencv-3.2.0
He intentado crear un programa simple con Python que usa OpenCV para obtener un video de mi cámara web y mostrarlo en la pantalla.
Sé que estoy parcialmente allí porque se creó la ventana y se enciende la luz de la cámara web, pero parece que no se ve nada en la ventana. Espero que alguien pueda explicar lo que estoy haciendo mal.
import cv
cv.NamedWindow("w1", cv.CV_WINDOW_AUTOSIZE)
capture = cv.CaptureFromCAM(0)
def repeat():
frame = cv.QueryFrame(capture)
cv.ShowImage("w1", frame)
while True:
repeat()
En una nota no relacionada, me he dado cuenta de que mi cámara web a veces cambia su número de índice en cv.CaptureFromCAM
, y a veces tengo que poner 0, 1 o 2 aunque solo tengo una cámara conectada y no la he desenchufado (I saber porque la luz no se enciende a menos que cambie el índice). ¿Hay alguna manera de que Python determine el índice correcto?
Intente agregar la línea c = cv.WaitKey(10)
en la parte inferior de su método repeat()
.
Esto espera 10 ms para que el usuario ingrese una clave. Incluso si no está usando la clave en absoluto, póngala. Creo que solo hubo un poco de retraso, por time.sleep(10)
que también puede funcionar time.sleep(10)
.
En cuanto al índice de la cámara, podrías hacer algo como esto:
for i in range(3):
capture = cv.CaptureFromCAM(i)
if capture: break
Esto encontrará el índice del primer dispositivo de captura "en funcionamiento", al menos para índices de 0-2. Es posible que haya varios dispositivos en su computadora reconocidos como un dispositivo de captura adecuado. La única manera que conozco para confirmar que tienes la correcta es mirando manualmente tu luz. Tal vez obtener una imagen y comprobar sus propiedades?
Para agregar un mensaje de usuario al proceso, puede vincular una tecla para cambiar de cámara en su ciclo de repetición:
import cv
cv.NamedWindow("w1", cv.CV_WINDOW_AUTOSIZE)
camera_index = 0
capture = cv.CaptureFromCAM(camera_index)
def repeat():
global capture #declare as globals since we are assigning to them now
global camera_index
frame = cv.QueryFrame(capture)
cv.ShowImage("w1", frame)
c = cv.WaitKey(10)
if(c=="n"): #in "n" key is pressed while the popup window is in focus
camera_index += 1 #try the next camera index
capture = cv.CaptureFromCAM(camera_index)
if not capture: #if the next camera index didn''t work, reset to 0.
camera_index = 0
capture = cv.CaptureFromCAM(camera_index)
while True:
repeat()
descargo de responsabilidad: no he probado esto, por lo que puede tener errores o simplemente no funciona, pero podría darle al menos una idea de una solución alternativa.
Prueba lo siguiente. Es simple, pero aún no he descubierto una forma elegante de salir.
import cv2.cv as cv
import time
cv.NamedWindow("camera", 0)
capture = cv.CaptureFromCAM(0)
while True:
img = cv.QueryFrame(capture)
cv.ShowImage("camera", img)
if cv.WaitKey(10) == 27:
break
cv.DestroyAllWindows()
Si solo tiene una cámara, o si no le importa cuál cámara es la correcta, utilice "-1" como índice. Es decir, para su ejemplo capture = cv.CaptureFromCAM(-1)
.
Una actualización para mostrar cómo hacerlo en las versiones recientes de OpenCV:
import cv2
cv2.namedWindow("preview")
vc = cv2.VideoCapture(0)
if vc.isOpened(): # try to get the first frame
rval, frame = vc.read()
else:
rval = False
while rval:
cv2.imshow("preview", frame)
rval, frame = vc.read()
key = cv2.waitKey(20)
if key == 27: # exit on ESC
break
cv2.destroyWindow("preview")
vc.release()
Funciona en OpenCV-2.4.2 para mí.
cambie import cv
para import cv2.cv as cv
Vea también la publicación here .