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

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

2 ответов


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

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

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

  1. библиотеки OpenCV используется для захвата видеопотоков с сетевых камер, см. OpenCV с сетевыми камерами. Каждая IP-камера может иметь другой API для доступа к видеопотокам (например, URL-адрес). Например, http://10.10.10.10/axis-cgi/mjpg/video.cgi?resolution=800x600&.mjpg.
  2. Ниже приведена ссылка на набор для сбора и разработки функций matlab mex для библиотеки OpenCV (благодаря коте Ямагучи):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)?. Круговой буфер необходимо сделать потокобезопасным, см. Потокобезопасная реализация кругового буфера.


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