【问题标题】:MATLAB - capturing video streams (MJPEG, rtsp, mpeg)MATLAB - 捕获视频流(MJPEG、rtsp、mpeg)
【发布时间】:2012-01-29 23:45:19
【问题描述】:

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

【问题讨论】:

  • 仅供参考,这是来自 MATLAB 支持的答案。“不幸的是,您是正确的,目前 Image Acquisition Toolbox 不支持 IP 摄像机。关于解决方法: 1. 如果 mmread 适合您,也许它是您可以在 64 位机器上安装 32 位 MATLAB。2. 编写自己的 MEX 驱动程序应该是一个可能的选择。3. IMREAD 能够从 IP 摄像机获取帧。也许可以利用此功能并构建一个构造视频流的函数。虽然帧速率可能是个问题。"
  • 帧率是 MATLAB 中 IMREAD 函数的问题 - 它只抓取单个图像,而不是流。我正在将我的 OpenCV C++ 代码编译为 Matlab mex 函数。以下是 OpenCV 库的 matlab mex 函数的收集和开发工具包的链接(感谢 Kota Yamaguchi):github.com/kyamagu/mexopencv.
  • 感谢 mexopencv 链接。我使用 videoio 库已有 2 年了,对此我感到非常满意。这很棒,但编译很麻烦。 mexopencv 的安装很简单。这些示例很棒,并且 mex 库以一种很棒的方式完成。我想我现在会切换到 mexopencv 和 opencv。
  • 我建议您发布您创建的解决方案作为答案,否则此问题将保持开放状态。
  • @DennisJaheruddin 完成。谢谢

标签: matlab opencv stream rtsp mjpeg


【解决方案1】:

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

很遗憾,您是正确的,目前 Image Acquisition Toolbox 不支持 IP 摄像机。关于变通方法: 1. 如果 mmread 适合您,也许您可​​以在 64 位机器上安装 32 位 MATLAB。 2. 编写自己的 MEX 驱动程序应该是一种可能的选择。 3. IMREAD 可以从网络摄像机获取帧。可以利用此功能并构建一个构造视频流的函数。虽然帧速率可能是个问题。

我建议实现您自己的 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

【讨论】:

  • 两年后我在这里尝试做同样的事情。你曾经能够做到这一点吗?
  • @KyleWright 我处于同样的位置。谁能帮我解决这个问题?
【解决方案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 可能会提示您下载它。 好消息是,该解决方案甚至不需要相机采集工具箱的许可证。

【讨论】:

    猜你喜欢
    • 2014-01-29
    • 2012-10-05
    • 2011-12-17
    • 2016-07-29
    • 2011-05-28
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多