2011-12-29 17 views
11

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)

+4

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

+1

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

+1

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

Odpowiedz

1

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:

  1. 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.
  2. 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); 
    } 
    
  3. 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.

+1

Oto jestem dokładnie dwa lata później próbuję zrobić to samo. Czy kiedykolwiek byłeś w stanie to osiągnąć? –

+0

@KyleWright Jestem w tej samej pozycji. Czy ktoś może mi w tym pomóc? – Shaked

+0

Mam ten sam problem. czy ktokolwiek jeszcze to rozwiązał? – Gulzar

1

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.