2011-12-29 24 views
11

¿Alguien ha trabajado con la captura de transmisiones de video desde cámaras IP en MATLAB? Por ejemplo, para tomar marcos en MATLAB desde rtsp: //10.10.10.10: 554/live.sdp (flujo rtsp) o desde http://x.x.x.x/axis-cgi/mjpg/video.cgi (flujo mjpeg). La herramienta de adquisición de imágenes de MATLAB no es compatible con esto. Encontré 2 opciones: 1) usando mmread. Sin embargo, la lectura de flujo http no es compatible con MATLAB de 64 bits o 2) para escribir mi propia función C++ que atrape marcos (uso la biblioteca OpenCV) y luego compilarlo en la función MATLAB MEX. Cualquier sugerencia es apreciada.MATLAB - captura de secuencias de video (MJPEG, rtsp, mpeg)

+4

Para su información, esta es la respuesta del soporte de MATLAB. "Desafortunadamente, tiene razón en que actualmente el Image Acquisition Toolbox no es compatible con cámaras IP. para instalar un MATLAB de 32 bits en su máquina de 64 bits 2. Escribir su propio controlador MEX debería ser una opción posible 3. IMREAD puede obtener marcos de cámaras IP. Puede ser posible utilizar este capacidad y crear una función que construya la secuencia de video. Aunque la velocidad de fotogramas puede ser un problema." – Alexey

+1

La velocidad de fotogramas es un problema con la función IMREAD en MATLAB, solo captura imágenes individuales, pero no una secuencia. Voy por la ruta de compilar mi código OpenCV C++ a la función Matlab mex. A continuación se muestra un enlace al kit de colección y desarrollo de funciones de matlab mex para la biblioteca OpenCV (gracias a Kota Yamaguchi): https://github.com/kyamagu/mexopencv. – Alexey

+1

GRACIAS por el enlace de mexopencv. Estoy usando la biblioteca de video desde hace 2 años y estaba bastante satisfecho con ella. genial, pero compilar fue una molestia. La instalación de mexopencv fue sencilla. Los ejemplos son geniales y la biblioteca mex está hecha de una manera increíble. Creo que cambiaré a mexopencv y opencv en este momento. – georg

Respuesta

1

Esta es la respuesta que obtuve de apoyo MATLAB:

Desafortunadamente, Tiene razón en que actualmente la adquisición de imágenes de la caja de herramientas no es compatible con cámaras IP. En cuanto a soluciones temporales: 1. Si mmread funciona para usted, quizás le sea factible instalar un MATLAB de 32 bits en su máquina de 64 bits. 2. Escribir su propio controlador MEX debería ser una opción posible. 3. IMREAD puede obtener marcos de cámaras IP. Es posible utilizar esta capacidad y crear una función que construya la transmisión de video. Aunque la velocidad de fotogramas puede ser un problema.

Le sugiero que implemente su propia función Matlab mex para captar marcos de video. Éstos son algunos consejos para hacerlo:

  1. biblioteca OpenCV se utiliza para capturar secuencias de vídeo de las cámaras de red, consulte OpenCV with Network Cameras. Cada cámara IP puede tener una API diferente para acceder a las transmisiones de video (es decir, la dirección URL). Por ejemplo, http://10.10.10.10/axis-cgi/mjpg/video.cgi?resolution=800x600&.mjpg.
  2. A continuación se muestra un enlace al kit de colección y desarrollo de funciones de matlab mex para la biblioteca OpenCV (gracias a Kota Yamaguchi): https://github.com/kyamagu/mexopencv. Esta biblioteca facilita la conversión entre los tipos de datos OpenCV y mxArray. Aquí está un ejemplo:

    #include "mexopencv.hpp" 
    void mexFunction(int nlhs, mxArray *plhs[], 
            int nrhs, const mxArray *prhs[]) 
        { 
        // Check arguments 
        if (nlhs!=1 || nrhs!=1) 
         mexErrMsgIdAndTxt("myfunc:invalidArgs", "Wrong number of arguments"); 
    
        // Convert MxArray to cv::Mat 
        cv::Mat mat = MxArray(prhs[0]).toMat(); 
    
        // Do whatever you want 
    
        // Convert cv::Mat back to mxArray* 
        plhs[0] = MxArray(mat); 
    } 
    
  3. La aplicación puede hacerse asíncrona mediante el uso de roscas, donde hilo productor agarra marcos de la cámara y lo pone en una memoria intermedia circular. El hilo consumidor, por otro lado, recupera los marcos del búfer y los convierte en salida mxArray (matriz). Ver How to implement a circular buffer of cv::Mat objects (OpenCV)?. La memoria intermedia circular tendrá que estar segura para la rosca, ver Thread safe implementation of circular buffer.

+1

Aquí estoy exactamente dos años más tarde tratando de hacer lo mismo. W ¿Alguna vez has podido lograr esto? –

+0

@KyleWright Estoy en la misma posición. Puede alguien ayudarme con esto? – Shaked

+0

tengo el mismo problema. ¿ALGUIEN solucionó esto todavía? – Gulzar

1

Desde MATLAB R2015a se ha convertido en muy fácil con la función de la cámara IP :

cam = ipcam('http://172.28.17.193/video.mjpeg', 'admin', 'password'); 
% preview the camera 
preview(cam); 

% close preview 
closepreview(cam); 

% Or get a snapshop... 
img = snapshot(cam); 
imshow(img); 

% release camera 
clear cam; 

La primera vez que se llama a esa función MATLAB puede pedirle que descargarlo. La buena noticia es que la solución ni siquiera requiere una licencia para la caja de herramientas de adquisición de la cámara.

Cuestiones relacionadas