Czy ktoś pracował z przechwytywaniem strumieni wideo z kamer IP w programie MATLAB? Na przykład, aby pobrać klatki w MATLAB z rtsp: //10.10.10.10: 554/live.sdp (strumień rtsp) lub z http://x.x.x.x/axis-cgi/mjpg/video.cgi (strumień mjpeg). Oprogramowanie MATLAB Image Acquisition Toolbox obecnie nie obsługuje tego. Znalazłem 2 opcje: 1) przy użyciu mmread. Jednak czytanie strumienia http nie jest obsługiwane przez 64-bitowe MATLAB lub 2), aby napisać własną funkcję C++, która łapie ramki (korzystam z biblioteki OpenCV), a następnie kompiluję je do funkcji MATLAB MEX. Wszelkie sugestie są mile widziane.MATLAB - przechwytywanie strumieni wideo (MJPEG, rtsp, mpeg)
Odpowiedz
Jest to odpowiedź dostałem od wsparcia MATLAB:
Niestety, masz rację, że obecnie Image Acquisition Toolbox nie obsługuje kamery IP. Jeśli chodzi o obejście: 1. Jeśli mmread działa dla ciebie, być może jest możliwe zainstalowanie 32-bitowego MATLAB na 64-bitowym komputerze. 2. Możliwe jest pisanie własnego sterownika MEX. 3. IMREAD jest w stanie uzyskać ramki z kamer IP. Może być możliwe wykorzystanie tej możliwości i zbudowanie funkcji konstruującej strumień wideo. Chociaż liczba klatek na sekundę może być problemem.
Sugeruję wdrożenie własnej funkcji Matlab mex do przechwytywania klatek wideo. Oto kilka wskazówek:
- Biblioteka OpenCV służy do przechwytywania strumieni wideo z kamer sieciowych, patrz: OpenCV with Network Cameras. Każda kamera IP może mieć inny interfejs API do uzyskiwania dostępu do strumieni wideo (tj. Adresu URL). Na przykład:
http://10.10.10.10/axis-cgi/mjpg/video.cgi?resolution=800x600&.mjpg
. Poniżej znajduje się link do zestawu kolekcji i rozwoju funkcji matlab mex dla biblioteki OpenCV (dzięki Kota Yamaguchi): https://github.com/kyamagu/mexopencv. Ta biblioteka ułatwia konwersję między typami danych OpenCV i mxArray. Oto przykład:
#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); }
Aplikacja może być asynchroniczne za pomocą nici, w którym gwint producent chwyta ramek z aparatu i umieszcza je w buforze cyklicznym. Z drugiej strony wątek konsumencki pobiera ramki z bufora i konwertuje je do wyjścia mxArray (macierz). Zobacz How to implement a circular buffer of cv::Mat objects (OpenCV)?. Bufor cykliczny musi być zabezpieczony przed gwintowaniem, patrz Thread safe implementation of circular buffer.
Od MATLAB R2015a to się bardzo proste dzięki funkcji 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;
Przy pierwszym wywołać tą funkcję MATLAB może poprosi, aby go pobrać. Dobrą wiadomością jest to, że rozwiązanie to nie wymaga nawet licencji na zestaw narzędzi do pozyskiwania kamer.
FYI, to jest odpowiedź od wsparcia MATLAB "Niestety, masz rację, że obecnie Image Acquisition Toolbox nie obsługuje kamery IP W odniesieniu do obejścia.. 1. Jeśli mmread pracuje dla ciebie, być może jest to wykonalne dla Ciebie zainstalować 32-bitową konsolę MATLAB na 64-bitowej maszynie 2. Możliwe jest zapisanie własnego sterownika MEX: 3. IMREAD może uzyskać ramki z kamer IP. Może być możliwe wykorzystanie tego możliwości i zbuduj funkcję, która tworzy strumień wideo. Chociaż liczba klatek na sekundę może być problemem." – Alexey
Liczba klatek na sekundę to problem z funkcją IMREAD w MATLAB-ie pobiera tylko pojedyncze obrazy, ale nie strumień.Pojawiam trasę kompilacji mojego kodu C++ OpenCV do funkcji Matlab mex. Poniżej znajduje się link do kolekcji i zestawu rozwojowego matlab mex funkcje biblioteki OpenCV (dzięki Kota Yamaguchi): https://github.com/kyamagu/mexopencv. – Alexey
DZIĘKI za link mexopencv. Używam biblioteki videoio od 2 lat i byłem z niej bardzo zadowolony. świetny, ale kompilacja była kłopotliwa, instalacja mexopencv była prosta, przykłady są świetne, a biblioteka mex jest zrobiona w niesamowity sposób.Myślę, że przejdę teraz na mexopencv i opencv – georg