MATLAB - 捕获视频流(MJPEG,rtsp,mpeg)

时间:2011-12-29 15:39:28

标签: matlab opencv stream rtsp mjpeg

有没有人在MATLAB中捕获来自IP摄像机的视频流?例如,从rtsp://10.10.10.10:554 / live.sdp(rtsp stream)或http://x.x.x.x/axis-cgi/mjpg/video.cgi(mjpeg流)中获取MATLAB中的帧。 MATLAB的Image Acquisition Toolbox目前不支持此功能。我找到了2个选项: 1)使用mmread。但是,64位MATLAB或不支持http流读取 2)编写自己的C ++函数来抓取帧(我使用OpenCV库),然后将其编译成MATLAB MEX函数。 任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:1)

这是我从MATLAB支持得到的答案:

  

不幸的是,你是正确的,目前图像采集工具箱不支持IP摄像头。关于变通方法:1。如果mmread适合您,也许您可​​以在64位计算机上安装32位MATLAB。 2.编写自己的MEX驱动程序应该是一个可能的选择。 3. IMREAD能够从IP摄像机获取帧。可以利用此功能并构建构建视频流的功能。虽然帧率可能是个问题。

我建议您实现自己的Matlab mex功能来抓取视频帧。以下是一些指示:

  1. OpenCV库用于捕获网络摄像机的视频流,请参阅OpenCV with Network Cameras。每个IP摄像机可以具有用于访问视频流的不同API(即URL地址)。例如,http://10.10.10.10/axis-cgi/mjpg/video.cgi?resolution=800x600&.mjpg
  2. 下面是OpenCV库的matlab mex函数集合和开发工具包的链接(感谢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);
    }
    
  3. 可以通过使用线程使应用程序异步,其中生产者线程从相机抓取帧并将其放入循环缓冲区。另一方面,消费者线程从缓冲区中检索帧并将它们转换为mxArray(矩阵)输出。见How to implement a circular buffer of cv::Mat objects (OpenCV)?。需要使循环缓冲区成为线程安全的,请参阅Thread safe implementation of circular buffer

答案 1 :(得分: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可能会提示您下载它。 好消息是解决方案甚至不需要相机采集工具箱的许可证。