有没有人在 MATLAB 中从 IP 摄像机捕获视频流?例如,在 MATLAB 中从 rtsp://10.10.10.10:554/live.sdp(rtsp 流)或http://xxxx/axis-cgi/mjpg/video.cgi(mjpeg 流)抓取帧。MATLAB 的图像采集工具箱目前不支持此功能。我找到了 2 个选项:1)使用mmread。但是在 64 位 MATLAB 下不支持 http 流读取或 2)编写我自己的 C++ 函数来抓取帧(我使用 OpenCV 库),然后将其编译成 MATLAB MEX 函数。任何建议表示赞赏。
2 回答
这是我从 MATLAB 支持中得到的答案:
不幸的是,您是正确的,目前 Image Acquisition Toolbox 不支持 IP 摄像机。关于变通方法: 1. 如果 mmread 适合您,也许您可以在 64 位机器上安装 32 位 MATLAB。2. 编写自己的 MEX 驱动程序应该是一种可能的选择。3. IMREAD 可以从网络摄像机获取帧。可以利用此功能并构建一个构造视频流的函数。虽然帧速率可能是一个问题。
我建议实现你自己的 Matlab mex 函数来抓取视频帧。以下是一些建议:
- OpenCV 库用于从网络摄像机捕获视频流,请参阅OpenCV with Network Cameras。每个 IP 摄像机可能有不同的 API 用于访问视频流(即 URL 地址)。例如,
http://10.10.10.10/axis-cgi/mjpg/video.cgi?resolution=800x600&.mjpg
。 以下是 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); }
应用程序可以通过使用线程来实现异步,其中生产者线程从相机中抓取帧并将其放入循环缓冲区中。另一方面,消费者线程从缓冲区中检索帧并将它们转换为 mxArray(矩阵)输出。请参阅如何实现 cv::Mat 对象的循环缓冲区(OpenCV)?. 需要使循环缓冲区成为线程安全的,请参阅循环缓冲区的线程安全实现。
从 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 可能会提示您下载它。好消息是该解决方案甚至不需要相机采集工具箱的许可证。