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

11

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


4
FYI,这是来自MATLAB支持的答复。“很遗憾,目前图像采集工具箱不支持IP摄像机。关于解决方法:
  1. 如果mmread对您有用,可能您可以在64位计算机上安装32位MATLAB。
  2. 编写自己的MEX驱动程序应该是一个可行的选项。
  3. IMREAD能够从IP摄像机获取帧。可能可以利用这种能力并构建一个构造视频流的函数。虽然帧率可能是个问题。”
- Alexey
1
帧率是MATLAB中IMREAD函数的一个问题 - 它只能抓取单个图像,而不能抓取流。我正在编译我的OpenCV C++代码到Matlab mex函数的路上。下面是一个链接,其中包含了OpenCV库的Matlab mex函数的集合和开发工具包(感谢Kota Yamaguchi):https://github.com/kyamagu/mexopencv。 - Alexey
1
感谢提供mexopencv链接。我已经使用videoio库2年了,感到非常满意。它非常好用,但编译却很麻烦。mexopencv的安装非常简单。例子也非常不错,而且mex库的处理方式真是太棒了。我想现在就切换到mexopencv和opencv。 - georg
我建议您将您创建的解决方案作为答案发布,否则这个问题将保持开放状态。 - Dennis Jaheruddin
2个回答

1

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

很遗憾,您说得对,目前图像采集工具箱不支持IP摄像头。关于解决方法:1. 如果mmread适用于您,也许您可以在64位机器上安装32位MATLAB。2. 编写自己的MEX驱动程序应该是一个可行的选项。3. IMREAD能够从IP摄像头获取帧。可能可以利用这个功能并构建一个函数来构造视频流。虽然帧率可能是一个问题。

我建议实现自己的Matlab mex函数来抓取视频帧。以下是一些指针:

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

1
在这里,两年后的现在我正在尝试做同样的事情。你是否曾经成功地完成了这个目标? - Kyle Wright
@KyleWright 我和你处于同样的位置。有人能帮我解决这个问题吗? - Shaked

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接