MATLAB - захват видео потоков (MJPEG, rtsp, mpeg) - PullRequest
11 голосов
/ 29 декабря 2011

Кто-нибудь работал с захватом видеопотоков с IP-камер в MATLAB? Например, чтобы получить кадры в MATLAB из rtsp: //10.10.10.10: 554 / live.sdp (поток rtsp) или из http://x.x.x.x/axis-cgi/mjpg/video.cgi (поток mjpeg). MATLAB Image Acquisition Toolbox в настоящее время не поддерживает это. Я нашел 2 варианта: 1) используя mmread . Однако чтение потока http не поддерживается в 64-битной среде MATLAB или 2) написать свою собственную функцию C ++, которая захватывает фреймы (я использую библиотеку OpenCV), а затем компилирую ее в функцию MATLAB MEX. Любые предложения приветствуются.

Ответы [ 2 ]

1 голос
/ 22 июля 2016

С MATLAB R2015a стало очень просто с функцией ipcam :

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;

При первом вызове этой функции MATLAB может предложить вам скачать ее.Хорошая новость заключается в том, что для решения даже не требуется лицензия на набор инструментов для приобретения камеры.

1 голос
/ 19 декабря 2012

Это ответ, который я получил от поддержки MATLAB:

К сожалению, вы правы в том, что в настоящее время набор инструментов для сбора изображений не поддерживает IP-камеры.Относительно обходных путей: 1. Если mmread работает для вас, возможно, вам выполнимо установить 32-битную MATLAB на 64-битную машину.2. Написание собственного MEX-драйвера должно быть возможным вариантом.3. IMREAD может получать кадры с IP-камер.Может быть возможно использовать эту возможность и создать функцию, которая создает видеопоток.Хотя частота кадров может быть проблемой.

Я предлагаю реализовать собственную функцию Mex Matlab для захвата видеокадров.Вот несколько советов для этого:

  1. Библиотека OpenCV используется для захвата видеопотоков с сетевых камер, см. OpenCV с сетевыми камерами .Каждая IP-камера может иметь свой API для доступа к видеопотокам (то есть URL-адрес).Например, http://10.10.10.10/axis-cgi/mjpg/video.cgi?resolution=800x600&.mjpg.
  2. Ниже приведена ссылка на набор для сбора и разработки функций matlab mex для библиотеки OpenCV (благодаря Kota Yamaguchi): https://github.com/kyamagu/mexopencv. Эта библиотека позволяет легко конвертировать между типами данных OpenCV иmxArray.Вот пример:

    #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. Приложение можно сделать асинхронным с помощью потоков, где поток производителя захватывает кадры с камеры и помещает их в кольцевой буфер.Потребительский поток, с другой стороны, извлекает кадры из буфера и преобразует их в вывод mxArray (matrix).См. Как реализовать кольцевой буфер объектов cv :: Mat (OpenCV)? .Циклический буфер должен быть защищен от потоков, см. Поточно-ориентированная реализация циклического буфера .

...