grabar - OpenCV con cámaras GigE Vision
opencv capture image from camera python (4)
¡Puedes hacerlo! 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 el GAPI SDK de Baumer en otra respuesta HERE , así que le daré un resumen de lo que necesita.
- Estudios visuales
- openCV 3 para C ++ ( HERE es un tutorial de youtube sobre cómo)
- Baumer GAPI SDK HERE
- (opcional) Pruebe la cámara y la tarjeta de interfaz de red utilizando el programa Camera Explorer 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.
- Configura tus variables del sistema. consulte la guía del programador en la carpeta de documentos Baumer GAPI SDK (debe estar en
C:/Program Files/Baumer/Baumer GAPI SDK/Docs/Programmers_Guide
). Consulte la sección 4.3.1. - Cree un nuevo proyecto de C ++ en Visual Studios y configure las propiedades. Consulte la sección 4.4.1.
- 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. - 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.
Agregue estas sentencias #include a la parte superior del archivo fuente .cpp:
#include <opencv2/core/core.hpp
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/video/video.hpp>
Agregue estas declaraciones de variables al comienzo de la función main()
// 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
En el archivo 005_PixelTransformation.cpp original, la línea 569 tiene un bucle for
que recorre más de 8 imágenes, lo que for(int i = 0; i < 8; i++)
. Queremos cambiar esto para que se ejecute continuamente. Hice esto cambiándolo a un ciclo while que dice
while (pDataStream->GetIsGrabbing())
Dentro del ciclo while hay una instrucción if
y else
para verificar el formato de píxeles de la imagen. Después de la instrucción else
cierre la llave y antes de pImage->Release();
declaración, agregue 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 elegir el formato de píxel correcto para su objeto openCvImage
. Elegí CV_8U
porque mi cámara es mono de 8 bits.
Cuando construyas y compiles, deberías obtener una ventana openCV que muestra la transmisión en vivo desde tu cámara.
Como dije, se puede hacer, porque lo he hecho. Si tiene problemas, consulte la guía del programador.
Necesito usar OpenCV con una cámara GigE Vision Ethernet, pero no pude encontrar mucha información útil sobre cómo hacer esto, ningún puntero, documentos ni código de ejemplo.
Necesito leer fotogramas de la cámara.
Gig-E es un estándar de comunicación para una amplia gama de cámaras. OpenCV ahora contiene un envoltorio para las cámaras basadas en Prosilica Gig-E (ver 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 una serie de patrones Bayer -> RGB.
El módulo CvCapture es conveniente para las pruebas, ya que puede leerse sin problemas desde una cámara o un archivo, pero no es realmente adecuado para la visión en tiempo real a alta velocidad.
No mencionas el tipo de cámara y tu plataforma. En Windows, de acuerdo con la documentación de OpenCV:
Actualmente, se pueden usar dos interfaces de cámara en Windows: Video para Windows (VFW) y Matrox Imaging Library (MIL)
Es poco probable que su controlador de cámara GigE sea 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 ++).
Uso 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.