2010-07-27 25 views
23

Necesito usar OpenCV con una cámara Ethernet GigE Vision, pero no pude encontrar mucha información útil sobre cómo hacer esto, ningún puntero, documento ni código de ejemplo.OpenCV con cámaras GigE Vision

Necesito leer marcos de la cámara.

Respuesta

15

Gig-E es un estándar de comunicación para una amplia gama de cámaras. OpenCV ahora contiene un contenedor para las cámaras basadas en Prosilica Gig-E (vea CV_CAP_PVAPI)

Pero, en general, es mejor usar la API nativa de la cámara para obtener los datos y luego usar openCV para convertir los datos devueltos en una imagen, openCv contiene un número del patrón Bayer -> rutinas RGB.

El módulo CvCapture es conveniente para la prueba, ya que puede leer fichero de tus ajustes desde una cámara o un archivo - pero no es realmente adecuado para la visión en tiempo real de alta velocidad

+1

específicamente para la visión GigE, sería mejor usar el SDK de Pleora, aunque no gratis. En general, sin embargo, es correcto recomendar el SDK nativo. Aún puede usar OpenCV para otros bits que no sean la captura. –

+0

Parece que ambos sugieren utilizar el SDK nativo para la cámara que se esté utilizando. (@JasonNewton, @MartinBeckett). ¿Porqué es eso? Me imagino que el rendimiento y el poder de la API son mejores. Pero, ¿y si la meta es la flexibilidad y no necesito funciones de alta potencia? – kdbanman

+1

@kdbanman Debe definir la flexibilidad, como la mejor configuración para usar el SDK nativo: muchas cosas no tienen forma de establecerse a través de abstracciones de apoyo cruzadas. La otra es si funciona correctamente/con solidez ... a menudo los conductores de alto nivel no pueden lidiar con las peculiaridades de una API específica del proveedor. Sin embargo, si está usando GigE, existe otra opción: Pleora SDK, que es mejor que cualquier otra implementación propietaria. Si desea todas las demás categorías, esa es la biblioteca que debe usar, no OpenCV. Es un poco extraño que no hayan agregado soporte para él en lugar de IMO de Allied Visions. –

3

No menciona el tipo de cámara ni su plataforma. En Windows, según la documentación OpenCV:

Actualmente dos interfaces de cámaras se pueden utilizan en Windows: Video para Windows (VFW) y Matrox Imaging Library (MIL)

Es poco probable que su controlador de cámara GigE es compatible con VFW, y para MIL necesita la biblioteca MIL, que no es gratuita AFAIK.

La mayoría de las cámaras GigE tendrán una API que puede usar para capturar imágenes. En la mayoría de los casos, la API se basará en GenICam. Probablemente su mejor enfoque es utilizar la API que viene con su cámara, y luego convertir la imagen capturada a una estructura IplImage (C) o clase Mat (C++).

+0

Gracias, sí, es en Windows. ¿Entonces OpenCV necesita un controlador para comunicarse con la cámara? –

+0

Probablemente sí. Más precisamente, la cámara probablemente necesita un controlador para comunicarse con Windows. Y necesita una API (SDK) de la cámara para comunicarse desde el software. Digo probablemente, porque depende de la cámara específica. –

4

utilizo una cámara uEye GigE (5240) con OpenCV. Funciona como un cv :: VideoCapture fuera de la caja. Sin embargo, el uso de la API permite un mayor control sobre los parámetros de la cámara.

+0

Hola, acabo de aterrizar aquí después de una agotadora búsqueda en Google de cómo leer este uEye con OpenCV, ¿podría proporcionarnos un fragmento de código rápido de cómo lo está haciendo? EDITAR: ¿No estarías haciendo esto en Linux? – Chriszuma

+0

No tengo la cámara aquí en este momento. Pero recuerdo lo que hice: utilicé el código de muestra para obtener imágenes de una cámara web. Algo como 'frame = cv :: Mat; cap = cv :: VideoCapture (0); cap.open(); marco << cap '. Cuando olvidé conectar la cámara web, OpenCV abrió la cámara uEye ya que era la única cámara conectada (a través de GigE) a la PC. Sin embargo, estoy bastante seguro de que estaba usando Windows en ese momento. –

+0

por lo que no necesita especificar la dirección IP de la cámara? – user391339

5

¡Usted puede hacer esto! Usé Baumer GAPI SDK, que es un consumidor de GenTL. GenTL es una capa de transporte genérica, que es un módulo dentro de genIcam. Puede leer en GenTL HERE. Usar un consumidor de GenTL como Baumer's GAPI o Basler's API hace las cosas mucho más fáciles. Deberían funcionar con cualquier cámara GigE.

Hice una forma más completa de usar Baumer's GAPI SDK en otra respuesta HERE, así que le daré un resumen de lo que necesita.

  1. Estudios Visuales
  2. OPENCV 3 para C++ (HERE es un tutorial de YouTube en la forma)
  3. Baumer GAPI SDK HERE
  4. (opcional) Prueba de su tarjeta de interfaz de la cámara y de la red mediante el programa de Explorador de la cámara de Baumer. Necesita habilitar paquetes jumbo. Es posible que también necesite configurar la dirección IP de la cámara y del automóvil utilizando el programa IPconfig de Baumer.
  5. Configure sus variables del sistema. consulte la guía del programador en la carpeta Baumer GAPI SDK docs (debe estar en C:\Program Files\Baumer\Baumer GAPI SDK\Docs\Programmers_Guide). Consulte la sección 4.3.1.
  6. Cree un nuevo proyecto de C++ en Visual Studios y configure las propiedades. Consulte la sección 4.4.1.
  7. Vaya a la carpeta de ejemplos y busque el ejemplo 005_PixelTransformation. Debe estar en (C:\Program Files\Baumer\Baumer GAPI SDK\Components\Examples\C++\src\0_Common\005_PixelTransformation). Copie el archivo C++ y péguelo en el directorio fuente de su nuevo proyecto.
  8. Verifica que puedes compilar y compilar. NOTA: Puede encontrar un problema con la parte que ajusta los parámetros de la cámara (por ejemplo, el tiempo de exposición). debería ver los valores de píxeles escritos en la pantalla para los primeros 6 píxeles en las primeras 6 filas, para 8 imágenes.

Añadir estas instrucciones # include a la parte superior del archivo de origen .cpp:

#include <opencv2\core\core.hpp 
#include <opencv2\highgui\highgui.hpp> 
#include <opencv2\video\video.hpp> 

Añadir estas declaraciones de variables al comienzo de la función

// OPENCV VARIABLE DECLARATIONS 
cv::VideoWriter cvVideoCreator;     // Create OpenCV video creator 
cv::Mat openCvImage;       // create an OpenCV image 
cv::String videoFileName = "openCvVideo.avi"; // Define video filename 
cv::Size frameSize = cv::Size(2048, 1088);  // Define video frame size 
cvVideoCreator.open(videoFileName, CV_FOURCC('D', 'I', 'V', 'X'), 20, frameSize, true); // set the codec type and frame rate 

main() En el 005_PixelTransformation originales archivo .cpp, línea 569 tiene un bucle for que recorre más de 8 imágenes, que dice for(int i = 0; i < 8; i++). Queremos cambiar esto para que se ejecute continuamente. Hice esto cambiándola a un bucle while que dice

while (pDataStream->GetIsGrabbing()) 

Dentro del bucle while hay una declaración if y else para comprobar el formato de imagen de píxeles. Después de la llave de cierre else declaración y antes de la declaración pImage->Release();, añadir las siguientes líneas

// OPEN CV STUFF 
openCvImage = cv::Mat(pTransformImage->GetHeight(), pTransformImage->GetWidth(), CV_8U, (int *)pTransformImage->GetBuffer()); 

// create OpenCV window ---- 
cv::namedWindow("OpenCV window: Cam", CV_WINDOW_NORMAL); 

//display the current image in the window ---- 
cv::imshow("OpenCV window : Cam", openCvImage); 
cv::waitKey(1); 

Asegúrese de que ha seleccionado el formato de píxel correcto para su objeto openCvImage. Elegí CV_8U porque mi cámara es mono de 8 bits.

Cuando construye y compila, ¡debería obtener una ventana openCV que muestre la transmisión en vivo desde su cámara!

Como dije, se puede hacer, porque ya lo hice. Si tiene problemas, consulte la guía del programador.

enter image description here

+0

gracias por aclarar la pila, Basler SDK por encima de GeniCam. ¿Basler implementa el estándar GeniCam en el controlador de la cámara? Supongo que GeniCam DLL llama al controlador de Basler para hacer el transporte del marco. ¿Correcto? –

+0

yes Basler sigue el estándar GeniCam. –

Cuestiones relacionadas