有没有人在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函数。 任何建议都表示赞赏。
答案 0 :(得分:1)
这是我从MATLAB支持得到的答案:
不幸的是,你是正确的,目前图像采集工具箱不支持IP摄像头。关于变通方法:1。如果mmread适合您,也许您可以在64位计算机上安装32位MATLAB。 2.编写自己的MEX驱动程序应该是一个可能的选择。 3. IMREAD能够从IP摄像机获取帧。可以利用此功能并构建构建视频流的功能。虽然帧率可能是个问题。
我建议您实现自己的Matlab mex功能来抓取视频帧。以下是一些指示:
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(矩阵)输出。见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可能会提示您下载它。 好消息是解决方案甚至不需要相机采集工具箱的许可证。