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 関数にコンパイルします。任意の提案をいただければ幸いです。
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 からダウンロードするように求められる場合があります。幸いなことに、ソリューションにはカメラ取得ツールボックスのライセンスさえ必要ありません。
これは、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. 以下は、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); }アプリケーションは、スレッドを使用して非同期にすることができます。この場合、プロデューサー スレッドはカメラからフレームを取得し、循環バッファーに入れます。一方、コンシューマ スレッドは、バッファからフレームを取得し、それらを mxArray (行列) 出力に変換します。cv::Mat オブジェクト (OpenCV) の循環バッファーを実装する方法を参照してください。. 循環バッファーはスレッドセーフにする必要があります。循環バッファーのスレッドセーフな実装を参照してください。