Ответ 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)?. Циркулярный буфер необходимо будет сделать потокобезопасным, см. Реализация потокового буферного буфера.