2012-06-13 13 views
7

He programado previamente la cámara web USB, donde el único objetivo es obtener los marcos en vivo de la cámara y visualizarlos en una ventana. Usé cvCaptureFromCAM para ese propósito, que funcionó bien para la cámara USB (ver el código a continuación).OpenCV: Cómo capturar fotogramas desde una cámara Ethernet

Quiero saber cómo capturar fotogramas desde una cámara Gigabit Ethernet? Supongo que necesito capturar fotogramas desde alguna dirección IP predeterminada usando alguna API. ¿Puede alguien señalarme hacia la dirección correcta?

Usaré C++ con OpenCV en Windows 7 en un procesador Intel i3.

#include "cv.h" 
#include "highgui.h" 
#include <stdio.h> 

// A Simple Camera Capture Framework 
int main() { 
    CvCapture* capture = cvCaptureFromCAM(CV_CAP_ANY); 
    if (!capture) { 
     fprintf(stderr, "ERROR: capture is NULL \n"); 
     getchar(); 
     return -1; 
    } 

    // Create a window in which the captured images will be presented 
    cvNamedWindow("mywindow", CV_WINDOW_AUTOSIZE); 

    // Show the image captured from the camera in the window and repeat 
    while (1) { 
     // Get one frame 
     IplImage* frame = cvQueryFrame(capture); 

     if (!frame) { 
      fprintf(stderr, "ERROR: frame is null...\n"); 
      getchar(); 
      break; 
     } 

     cvShowImage("mywindow", frame); 

     // Do not release the frame! 
     // If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version), 
     // remove higher bits using AND operator 
     if ((cvWaitKey(10) & 255) == 27) break; 
    } 

    // Release the capture device housekeeping 
    cvReleaseCapture(&capture); 
    cvDestroyWindow("mywindow"); 
    return 0; 
} 

actualización

Así que ahora soy capaz de mostrar las imágenes en directo en el proveedor de software de interfaz gráfica de usuario proporcionada. Pero aún así quiero mostrar la imagen (y posiblemente el video) usando la dirección IP de la cámara.

Cuando conozco la dirección IP de la cámara, ¿por qué no puedo acceder a los datos (imágenes) enviados por la cámara y mostrar en el navegador? Traté de escribir la dirección IP de la cámara (es decir, 192.169.2.3) en mi navegador (192.169.2.4), pero dice "página no encontrada". Qué significa eso?

+0

posible duplicado de [OpenCV con cámaras de red] (http://stackoverflow.com/questions/712998/opencv-with-network-cameras) – karlphillip

+0

Es también un posible duplicado de [OpenCV con GigE Vision Cámaras] (http://stackoverflow.com/questions/3345467/opencv-with-gige-vision-cameras). – karlphillip

+0

Gracias, noté tus comentarios después de publicar la actualización. Veré los enlaces. – gpuguy

Respuesta

3

No podrá acceder a las imágenes en la cámara si no tiene un servidor web en ejecución (verifique su doco). intente escribir esto en la línea de comandos:

telnet 192.169.2.3 80 

Si los tiempos de telnet a cabo, la cámara no se está ejecutando un servidor en el puerto predeterminado 80.

Véase también esta pregunta: C++ code Capturing image from IP/Ethernet Cameras (AXIS Cam)

+0

gracias esto tiene mucho sentido. gracias – gpuguy

0

Como es una cámara IP que significa que hay un servidor web ejecutándose, debe conocer el puerto de ese servidor, debe encontrarlo en el manual, si no puede encontrarlo, hay un programa llamado "iSpy", este programa escaneará el LAN y encontrará toda la información necesaria para conectarse a su CAM solo google para iSpy y puede descargarlo, es gratis .

6

Puede hacerlo utilizando la API genIcam. genIcam es una interfaz genérica para cámaras (USB, GigE, CameraLink, etc.). Se compone de varios módulos, pero lo que más le preocupa es GenTL (capa de transporte). Puede leer más en la documentación de GenTL HERE. Para facilitar el proceso, recomiendo usar la API de Basler o la API de Baumer, que son consumidores de GenTL (los productores y los consumidores se describen en la documentación de GenTL). Usé la API de Baumer, pero ambas funcionarán.

NOTA: Estoy usando una cámara mono Baumer HXG20.

COSAS Para descargar e instalar

  1. Visual Eddition Estudios Comunidad (utilicé 2015 LINK)
  2. Baumer GAPI SDK, LINK
  3. OPENCV (aquí es un tutorial de youtube para construir OPENCV 3 para C++) HERE

TEST CAMER A CON EXPLORADOR DE CÁMARA

Es una buena idea comprobar que la tarjeta de interfaz de red (NIC) y la cámara GigE funcionan y funcionan con la cámara utilizando el programa Camera Explorer. Es posible que deba habilitar Jumbo Packets en su NIC. También puede configurar la IP de la cámara usando el programa IPconfig. Utilizo la configuración de DHCP pero también puede usar una IP estática para su cámara y NIC.

CONFIGURACIÓN ESTUDIOS VISUALES

Los pasos para configurar las variables de entorno del sistema y la configuración de los estudios visuales están descritas en la Baumer GAPI guía programadores SDK (capítulo 4), que se encuentra en el siguiente directorio

C:\Program Files\Baumer\Baumer GAPI SDK\Docs\Programmers_Guide

  • Compruebe que ha recibido la siguiente variable de sistema (si se utiliza la versión de 64 bits), o crear la variable si es necesario (re fer a la sección 4.3.1 en la guía del programador).

    • name = GENICAM_GENTL64_PATH
    • valor = C:\Program Files\Baumer\Baumer GAPI SDK\Components\Bin\x64\
  • en los estudios de visual, cree un proyecto nuevo C++ y actualizar las siguientes propiedades (se refieren a la sección 4.4.1 en la guía del programador).

    • C/C++> General> adicional Introducir Directorios = C:\Program Files\Baumer\Baumer GAPI SDK\Components\Dev\C++\Inc
    • Enlazador> General> Directorios de biblioteca adicionales = C:\Program Files\Baumer\Baumer GAPI SDK\Components\Dev\C++\Lib\x64
    • Linker> Entrada> Dependencias adicionales = bgapi2_genicam.lib
    • Eventos de generación> posterior a la generación de eventos > línea de comandos = copy "C:\Program Files\Baumer\Baumer GAPI SDK\Components\Bin\x64"\*.* .\

crear un archivo .CPP PARA MOSTRAR flujo de imagen en una ventana OPENCV

La forma más sencilla de empezar es utilizar uno de los códigos de ejemplo proporcionados en el Baumer GAPI SDK y modificarlo para agregar la funcionalidad OPENCV.El código de ejemplo para utilizar es 005_PixelTransformation, que se encuentra aquí

C:\Program Files\Baumer\Baumer GAPI SDK\Components\Examples\C++\src\0_Common\005_PixelTransformation

Copiar y pegar este archivo .cpp en el directorio fuente del proyecto y asegúrese de que se puede construir y compilar. Debe capturar 8 imágenes e imprimir los primeros 6 valores de píxel de las primeras 6 líneas para cada imagen.

Añadir estas declaraciones #include al 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 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 (frame width x height) 
cvVideoCreator.open(videoFileName, CV_FOURCC('D', 'I', 'V', 'X'), 20, frameSize, true); // set the codec type and frame rate 

En el archivo original 005_PixelTransformation.cpp, la 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 de nuestro nuevo bucle while, hay una declaración if que comprueba si el formato de píxel es el 'Mono' (escala de grises) o color. En el archivo original, comienza en la línea 619 y finaliza en 692. Inmediatamente después de cerrar if y else llaves de declaración, y antes de la instrucción pImage->Release();, necesitamos agregar la parte openCV para mostrar las imágenes en una ventana. Añadir las siguientes líneas de código

} // This is the closing brace for the 'else color' statement 

// 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); 

Una cosa a tener en cuenta es el formato de píxel del objeto openCvImage. Mi cámara es mono de 8 bits, por lo que debo especificar CV_8U. Si su cámara es de píxeles RGB o de 10 bits, debe proporcionar el formato correcto (consulte la documentación de openCV HERE).

puede consultar los otros ejemplos para ajustar los parámetros de la cámara.

ahora una vez que compile y compile, ¡debe tener abierta una ventana openCV que muestre las imágenes de la cámara!

SUBE PARA MÁS VOTO PERSONAS !!!! (Esto tomó mucho tiempo para conseguir trabajo por lo me enganche !!!)

THUMBS UP FOR MORE UP VOTES!!!!!

+0

Puedo confirmar que esto funciona en un programa Win32 Baumer-GAPI 2.8.1 en Win7 64bit cantar la cámara Baumer TXG06. Gracias por el camino. –

0

Para añadir a mark jay 's respuesta (que puedo confirmar trabajos sobre Win7x64 dentro de un programa Win32 usando Baumer- GAPI2 2.8.1 y el compilador VC10 y una cámara Baumer TXG06). Si la cámara está configurada para tomar Mono8 y tiene la intención de tomar una imagen del mismo formato CV_8UC1, en el ejemplo 005_PixelTransformation.cpp puede evitar la creación de BGAPI2::Image* pTransformImage y y simplemente compilar el cv::Mat usando el puntero de memoria del buffer como en el siguiente extracto de mi clase GigE_cam:

bool GigE_cam::operator>>(cv::Mat& out_mat) 
{ 
    bool success(false); 
    try 
    { 
     _p_buffer_filled = _p_data_stream->GetFilledBuffer(static_cast<bo_uint64>(_timeout_ms)); 
     if(_p_buffer_filled != 0) 
     { 
      if(_p_buffer_filled->GetIsIncomplete()) 
      { 
       _p_buffer_filled->QueueBuffer(); 
      } 
      else 
      { 
       if(_p_buffer_filled->GetPixelFormat() == "Mono8") 
       { 
        _image_out_buffer = cv::Mat(static_cast<int>(_p_buffer_filled->GetHeight()), 
               static_cast<int>(_p_buffer_filled->GetWidth()), 
               CV_8UC1, 
               static_cast<uchar*>(_p_buffer_filled->GetMemPtr())); 
        if(_image_out_buffer.data) 
        { 
         _image_out_buffer.copyTo(out_mat); 
         success = true; 
        } 
       } 
       else if(_p_buffer_filled->GetPixelFormat() == "Mono10") 
       { 
        // Todo transform to BGR8 etc. not implemented 
       } 
       _p_buffer_filled->QueueBuffer(); // Queue buffer after use 
      } 
     } 
    } 
    catch(BGAPI2::Exceptions::IException& ex) 
    { 
     _last_BGAPI2_error_str = ex.GetType(); 
    } 
    return success; 
} 

Este código está recibiendo imágenes completas de la cámara (776 x 582 píxeles) a 66,5 fps donde incluso la hoja de datos sólo se reclama 64,0 fps. Tengo curiosidad por ver si su API actuará de la misma manera en Debian.

Incoming Image

Cuestiones relacionadas