Кто-нибудь работал с захватом видеопотоков с 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. Любые предложения приветствуются.
MATLAB - захват видеопотоков (MJPEG, rtsp, mpeg)
Ответ 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 может запросить ее загрузить. Хорошей новостью является то, что решение даже не требует лицензии на панель сбора данных камеры.