11

MATLAB で IP カメラからビデオ ストリームをキャプチャしたことのある人はいますか? たとえば、MATLAB で rtsp://10.10.10.10:554/live.sdp (rtsp ストリーム) またはhttp://xxxx/axis-cgi/mjpg/video.cgi (mjpeg ストリーム) からフレームを取得します。MATLAB の Image Acquisition Toolbox は現在これをサポートしていません。2 つのオプションが見つかりました: 1) mmreadを使用します。ただし、http ストリームの読み取りは 64 ビット MATLAB ではサポートされていません。または 2) フレームを取得する独自の C++ 関数を作成し (OpenCV ライブラリを使用)、それを MATLAB MEX 関数にコンパイルします。任意の提案をいただければ幸いです。

4

2 に答える 2

1

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 からダウンロードするように求められる場合があります。幸いなことに、ソリューションにはカメラ取得ツールボックスのライセンスさえ必要ありません。

于 2016-07-22T05:08:39.053 に答える
1

これは、MATLAB サポートから得た回答です。

残念ながら、現在 Image Acquisition Toolbox が IP カメラをサポートしていないことは間違いありません。回避策について: 1. mmread が機能する場合は、32 ビット MATLAB を 64 ビット マシンにインストールすることが可能です。2. 独自の MEX ドライバーを作成することが可能なオプションです。3. IMREAD は、IP カメラからフレームを取得できます。この機能を利用して、ビデオ ストリームを構築する関数を構築できる可能性があります。フレームレートが問題になる場合がありますが。

ビデオ フレームを取得するには、独自の Matlab mex 関数を実装することをお勧めします。そのためのヒントを次に示します。

  1. OpenCV ライブラリは、ネットワーク カメラからビデオ ストリームをキャプチャするために使用されます。ネットワーク カメラを使用した OpenCV を参照してください。各 IP カメラは、ビデオ ストリームにアクセスするための異なる API (つまり、URL アドレス) を持っている場合があります。たとえば、http://10.10.10.10/axis-cgi/mjpg/video.cgi?resolution=800x600&.mjpg.
  2. 以下は、OpenCV ライブラリ用の matlab mex 関数のコレクションおよび開発キットへのリンクです (山口浩太氏に感謝): 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);
    }
    
  3. アプリケーションは、スレッドを使用して非同期にすることができます。この場合、プロデューサー スレッドはカメラからフレームを取得し、循環バッファーに入れます。一方、コンシューマ スレッドは、バッファからフレームを取得し、それらを mxArray (行列) 出力に変換します。cv::Mat オブジェクト (OpenCV) の循環バッファーを実装する方法を参照してください。. 循環バッファーはスレッドセーフにする必要があります。循環バッファーのスレッドセーフな実装を参照してください。

于 2012-12-18T20:20:57.943 に答える