这是我从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 .
以下是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 .