Ale*_*xey 11 matlab opencv stream mjpeg rtsp
有没有人在MATLAB中捕获来自IP摄像机的视频流?例如,从rtsp://10.10.10.10:554/live.sdp(rtsp stream)或http://xxxx/axis-cgi/mjpg/video.cgi(mjpeg stream)中获取MATLAB中的帧.MATLAB的Image Acquisition Toolbox目前不支持此功能.我找到了2个选项:1)使用mmread.但是在64位MATLAB下不支持http流读取或2)编写我自己的C++函数来抓取帧(我使用OpenCV库)然后将其编译成MATLAB MEX函数.任何建议表示赞赏.
这是我从 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);
}
Run Code Online (Sandbox Code Playgroud)可以使用线程使应用程序异步,其中生产者线程从相机抓取帧并将其放入循环缓冲区中。另一方面,消费者线程从缓冲区检索帧并将其转换为 mxArray(矩阵)输出。请参阅如何实现 cv::Mat 对象的循环缓冲区 (OpenCV)?。循环缓冲区需要成为线程安全的,请参阅循环缓冲区的线程安全实现。