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.
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.
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
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++).
Gracias, sí, es en Windows. ¿Entonces OpenCV necesita un controlador para comunicarse con la cámara? –
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. –
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.
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
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. –
por lo que no necesita especificar la dirección IP de la cámara? – user391339
¡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.
C:\Program Files\Baumer\Baumer GAPI SDK\Docs\Programmers_Guide
). Consulte la sección 4.3.1.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.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.
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? –
yes Basler sigue el estándar GeniCam. –
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. –
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
@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. –