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