MATLAB - захват видеопотоков (MJPEG, rtsp, mpeg)

Кто-нибудь работал с захватом видеопотоков с 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) написать мою собственную функцию С++, которая захватывает фреймы (я использую библиотеку OpenCV), а затем скомпилирую ее в MATLAB MEX. Любые предложения приветствуются.

Ответ 1

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

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

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

  • Библиотека OpenCV используется для захвата видеопотоков с сетевых камер, см. OpenCV с сетевыми камерами. Каждая IP-камера может иметь различный API для доступа к видеопотокам (т.е. URL-адрес). Например, http://10.10.10.10/axis-cgi/mjpg/video.cgi?resolution=800x600&.mjpg.
  • Ниже приведена ссылка на набор для коллекции и разработки функций 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);
    }
    
  • Приложение можно сделать асинхронным с помощью потоков, где производственный поток захватывает кадры из камеры и помещает их в круговой буфер. Потребительский поток, с другой стороны, извлекает кадры из буфера и преобразует их в вывод mxArray (matrix). См. Как реализовать круговой буфер объектов cv:: Mat (OpenCV)?. Циркулярный буфер необходимо будет сделать потокобезопасным, см. Реализация потокового буферного буфера.

Ответ 2

Так как 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 может запросить ее загрузить. Хорошей новостью является то, что решение даже не требует лицензии на панель сбора данных камеры.