2010-12-13 24 views
9

He instalado OpenCV 2.2 y ahora no puedo hacer que funcione la captura de la cámara web. Funcionó bien en 2.1. OpenCV detecta una cámara web, no informa ningún error o advertencia, pero cada cuadro es una imagen gris. Incluso probé una muestra de código de OpenCV wiki:Problema de captura de la cámara web OpenCV

VideoCapture cap(0); // open the default camera 
if(!cap.isOpened()) // check if we succeeded 
    return -1; 

Mat edges; 
namedWindow("edges",1); 
for(;;) 
{ 
    Mat frame; 
    cap >> frame; // get a new frame from camera 
    cvtColor(frame, edges, CV_BGR2GRAY); 
    //GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); 
    //Canny(edges, edges, 0, 30, 3); 
    imshow("edges", edges); 
    if(waitKey(30) >= 0) break; 
} 
// the camera will be deinitialized automatically in VideoCapture destructor 
return 0; 

¿Alguien se encontró con este problema? Estoy usando 64 bits Win7 y Visual Studio 2010.

+2

¿Qué quiere decir con " una imagen gris? Gris sólido, sin estructura? ¿O solo una imagen en escala de grises? Está llamando a cvtColor() para escalar en escala de grises la imagen, y la llamada a imshow() muestra la versión en escala de grises ... – jtdubs

+0

Gris sólido, no en escala de grises. – Figaro

+0

A veces, este ib es un poco lento. Agregue un 'sleep (1)' o 'cv :: waitKey (100)' antes de Mat edge y agregue lo mismo dentro del ciclo for. Esto debería funcionar. Y no te olvides de chekc si 'frame' es una imagen de prper. – nutario

Respuesta

1

Realmente no sé nada sobre OpenCV, pero ¿no es el problema en la siguiente línea?

cvtColor(frame, edges, CV_BGR2GRAY); 

Parece que está convirtiendo intencionadamente un espacio de color B-G-R en un espacio de escala de grises.

¿No debería ser algo como:

cvtColor(frame, edges, CV_BGR2RGB); 
+0

la mayoría de los algoritmos de detección de bordes solo funcionan en imágenes en escala de grises: la opción muestra la imagen en escala de grises en lugar del color original –

+0

Ese es el problema al dar mi opinión sobre un asunto que no sé ... :) Pensé que el problema era la imagen en escala de grises, no una imagen gris en sí misma ... Tonto de mí. :) – Machado

9

he encontrado la solución después de una búsqueda muy larga.

El problema es que si no se produce un retraso entre mostrar los fotogramas, se produce este problema.

La solución se pone cvWaitKey(20); en el bucle.

+1

¡Solo quería agregar un comentario que esto solucionó mi problema! Gracias :) – amr

3

El problema fue con la cámara que utilicé, MSFT LifeCam. Intenté con Logitech C210 y 120 y ambos funcionan bien.

0

También puede consultar this post.

Para decirlo simple, cambiando

de

CV Importación

a

cv2.cv importación como CV

funcionó para mí. Véase también la publicación here.

3

Aquí está la solución.

Cada fotograma capturado se está convirtiendo en una imagen en escala de grises en la primera línea a continuación. Comentar y ejecutar el código solo mostrará un error ya que no está capturando ninguna imagen procesada en el marco de bordes, que se muestra en imshow.

Por lo tanto, comente la línea cvtColor y cambie el segundo parámetro en imshow por . Esto le permitirá visualizar el video en color desde la cámara web.

cvtColor(frame, edges, CV_BGR2GRAY); 

imshow("edges", frame); 
0

Tuve el mismo problema. Pensé que podría ser la configuración de mi cámara, porque se suponía que tenía una entrada de 640x480px (que no pude ajustar) y no pude ajustar los permisos para el feed. Así que instalé una cámara web virtual, que prácticamente resolvió ambos problemas. Obtuve un diálogo de entrada, elegí la cámara virtual y funcionó. Logré configurarlo a 640x480 en la aplicación también.

Mi cámara virtual se llamaba ManyCam, pero parece que está hecha para adolescentes, quería que instalara otras 3 aplicaciones y todavía no estoy seguro de que el clima no incluya troyanos "complementarios".

Sin embargo, le permite ajustar los colores, el tono, el contraste, etc. y otras cosas que pueda necesitar para la prueba.

+0

Será mejor que dejes un comentario primero para preguntar si se puede agregar una cámara virtual. – StarPinkER

0

estoy usando cvtColor y encontró que

cvtColor(image,image,CV_BGR2RGB); no funcionó.

¡Pero la buena noticia es que este cambio funciona!

cvtColor(image,image,**COLOR_BGR2RGB**); 

también incluyen:

include opencv2/imgproc/imgproc.hpp 

y en el archivo .pro la biblioteca:

-lopencv_imgproc 
0

Prueba esto:

VideoCapture cap(0); // open the default camera 
if(!cap.isOpened()) // check if we succeeded 
{ 
    cout<<"Cam not captured\n"; 
} 

Mat frame; 
namedWindow("frame"); 
for(;;) 
{ 
    cap >> frame; // get a new frame from camera 
    imshow("frame", frame); 

    if(waitKey(10) >= 0) break; 
} 

return 0; 
Cuestiones relacionadas