Acceso a la webcam con OpenCV
Usando la biblioteca OpenCV podemos acceder a la cámara web o cualquier otro dispositivo de captura que tengamos instalado en nuestro sistema, cada una de las imágenes capturadas podrán almacenarse para su análisis o procesamiento en tiempo real si así lo deseamos, tenemos disponible una clase que nos servirá para guardar los videos previamente capturados y procesados, el formato de almacenamiento depende de las características habilitadas, pero puede ser MP4, AVI, WMV, etc., y otros si tenemos los códec.
Webcam desde OpenCV
Para acceder a la webcam lo hacemos de manera parecida a como mostramos un video solo que en lugar de especificar un archivo de video a la clase VideoCapture
indicaremos el número de dispositivo o índice de cámara que deseamos usar, cero si tenemos solo una cámara.
Código C++
#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
VideoCapture cap(0);
if(!cap.isOpened())
return -1;
namedWindow("webcam");
for(;;)
{
Mat frame;
cap >> frame;
imshow("webcam", frame);
if(waitKey(50) >= 0) break;
}
return 0;
}
Usamos cap.isOpened()
para verificar si la cámara se ha iniciado correctamente, el código cap >> frame;
envía la imagen capturada por la webcam al objeto Mat
indicado.
Código Python
from cv2 import *
namedWindow("webcam")
vc = VideoCapture(0);
while True:
next, frame = vc.read()
imshow("webcam", frame)
if waitKey(50) >= 0:
break;
La versión Python es similar, salvo que este caso usamos el método vc.read()
para obtener la imagen capturada por la cámara.
Si deseamos procesar cada uno de los cuadros del video capturado podemos hacerlo del mismo modo como lo hicimos de un video pregrabado, veamos un ejemplo:
Código C++
for(;;)
{
Mat frame, edges;
cap >> frame;
cvtColor(frame, edges, CV_BGR2GRAY);
GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
Canny(edges, edges, 0, 30, 3);
imshow("webcam", edges);
if(waitKey(50) >= 0) break;
}
Código Python
while True:
next, frame = vc.read()
gray = cvtColor(frame, COLOR_BGR2GRAY)
gauss = GaussianBlur(gray, (7,7), 1.5, 1.5)
can = Canny(gauss, 0, 30, 3)
imshow("webcam", can)
if waitKey(50) >= 0:
break;
En este ejemplo aplicamos varias funciones que nos permiten modificar la imagen original, primero cvtColor
, convierte la imagen a escala de grises, GaussianBlur
, aplicar un filtro gaussiano, y finalmente aplicamos Canny
este nos permite detectar los bordes de la imagen, puedes ver más filtros de imagen que puedes aplicar.
Almacenar video en disco
Si deseamos grabar el video proveniente de la webcam, en disco, podemos hacerlo mediante la clase VideoWriter
, en el constructor o el método open debemos indicar el nombre con que deseamos guardar el archivo con la extensión, el códec que usaremos, los cuadros por segundo y la resolución del video.
Por ejemplo, para grabar la captura de la webcam en un video AVI:
VideoWriter wtr("webcam.avi", CV_FOURCC('M','J','P','G'), 30, Size(640,480));
Para indicar el códec debemos indicar las cuatro letras que lo identifican:
- CV_FOURCC('P','I','M','1') para codec MPEG-1 codec.
- CV_FOURCC('M','J','P','G') para códec motion-jpeg.
Existen más códec puedes verlos aquí: http://www.fourcc.org/codecs.php, siempre que estén correctamente instalados para poder usarlos.
Para finalizar solo nos falta escribir cada cuadro, lo podemos hacer de dos modos:
wtr.write(dest);
También es válido:
wtr << dest;
Recordemos que este código debe ir dentro del bucle, después de procesar la imagen, en este caso dest en la imagen ya procesada que deseamos guardar.
Siguiente Tutorial: Detección de rostros
Hola estoy teinendo un problema al compilar estos dos codigo, me marca un error:
ResponderEliminarUnhandled exception at 0x7682b727 in Opencv4.exe: Microsoft C++ exception: cv::Exception at memory location 0x0041f8ac
El error es similar en los dos codigos solo que varia al final la locacion, de antemano agradesco su ayuda.
Hola al compilar me marca un error, mi error es class cv:videowriter has no member 'release' que podria ser...?
ResponderEliminarHola, tengo una duda. Pongo el codigo y lo corre, pero la camara no es activada ni nada, menos marca un error. ¿A que podria deberse?
ResponderEliminarHola, tengo una duda, quiero capturar cierto número de frames, por ejemplo cada 5 frames para saber la posición de un objeto y que el proceso no sea tan lento, ¿cómo podría hacerlo? lo he intentado con CAM_PROP_FRAME_COUNT pero no me funciona
ResponderEliminarHaz un contador normal y corriente,
Eliminardeclara antes del bucle la variable:
int contador = 0;
for(;;){
contador++;
if(contador divisible entre 5){
continue; // salta de nuevo al principio del bucle
}
// captura y procesado de lo que quieras
}
Se puede trabajar con dos cámaras a la vez, es decir declarar cv2.VideoCapture(0) y videocapture(x) dependiendo de las camaras que desee utilizar para detectar diferentes perspectivas ?
ResponderEliminarNo lo he probado, pero creo que si se puede.
EliminarHola, me ha funcionado bien, muchas gracias por el aporte, sin embargo, me he dado cuenta que los frames son más pequeños, el video me toma de 480x640 desde python y abrir la web cam desde la app de windows me lo hace con 720x1280
ResponderEliminarSabes como seleccionar la configuración de la cámara para que tome la mejor resolución ?
Debes establecer las dimensiones usando set de VideoCapture:
Eliminarvc.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
vc.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
Debes tener el cuidado de que la resolución que introduces esté soportada por la webcam.
Hola muchas gracias por la informacion. Sabes como se captura una camara stereo y despues que se pueda dividir en dos imagenes, Gracias
ResponderEliminarHola. Tengo una pregunta, me gustaría poder leer códigos QR con mi cámara. Cómo puedo hacerle?
ResponderEliminarAquí tienes un tutorial explicando el proceso: http://acodigo.blogspot.com/2019/10/opencv-lector-de-codigos-qr.html
EliminarHola, tengo un problema a la hora de intentar guardar el archivo con python, el Vídeo se muestra correctamente mientras se ejecuta, pero el archivo que se guarda está corrupto.
ResponderEliminarret, im = vid.read()
if ret == True:
# Convertimos a escala de grises.
gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
# Aplicamos un suavizado Gaussiano.
im_blur = cv2.GaussianBlur(gray, (3,3), 0)
# Detectamos los bordes.
bordes = cv2.Canny(image=im_blur, threshold1=10, threshold2=200)
salida.write(bordes) # Escribimos el vídeo.
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
Eliminar# Generamos archivo de salida.
salida = cv2.VideoWriter('nuevo.mp4',fourcc,60,(w,h))
Hola, en el caso de que te ponga namedWindow no esta definida, como se podria arreglar.
ResponderEliminarsoy nuevo
muchas gracias
Hola, hoy llegue a experimentar con estos códigos y vi que no es necesario esa linea solo la comente y cambie la linea de from cv2 import * por import cv2 y agregando el cv2.VideoCapture(0), cv2.imshow() y cv2.waitKey(). Espero te sirva yo estoy usando el IDLE de Python
EliminarExcelente muchas gracias!!!
ResponderEliminarAhora solo me falta la webcam, pero creo que una rfx 711 es una gran opcion