用 MATLAB 读取网络摄影机,真的是件超级麻烦的事情。

表面上是有一个好用的 ipcam 函数,但是限制太多。

※ 本文于 2019/06/19 更新程序及部分内文 ※

若您想要使用 MATLAB 读取网络摄影机的话,

那么最容易找到的方法应该是使用 ipcam 这个函数。

首先要到 Add-on 下载相关套件:MATLAB Support Package for IP Camera

(警告:若您使用非正版的 MATLAB ,从 Add-On 下载套件的任何后果请自行负责。)

该套件的用法如下:cam = ipcam('URL')

cam = ipcam('URL', 'Username', 'Password')

cam = ipcam('URL', 'Username', 'Password', 'Timeout', Timeout)

但是坦白说,这个函数很难用,除了要先去下载安装包就算了,

重点是这个函数不能吃 “h.264” 的影像串流,只能够接受“mjpeg”的格式。

夏恩从维基百科撷取一段文字过来:

H.264,又称为MPEG-4第10部分,是一种面向块的基于运动补偿的影片编码标准。

到 2014年,它已经成为高精度影片录制、压缩和发布的最常用格式之一。

H.264这么好,然后MATLAB说不能吃!开什么玩笑!

好吧,夏恩的版本是R2016b,说不定之后的版本已经解决了这个问题。

※ 2019.06.19 更新资讯:R2019a 仍然没有解决这个问题。※

所以,为了解决这个问题,只好自己设计一个撷取 ipcam 的程序了!

以下使用 C# 和 EmguCV 写一个撷取程序,再把数据送给 MATLAB 用。

环境介绍:

编译器:Visual Studio 2015 community (注册电子信箱就可以用)

项目类型:类库 (请不要忽略这句话)

目标Framework:.NET Framework 4.5.2

EmguCV版本:emgucv-windesktop 4.0.1.3373

目标CPU:x64 (有些编译器默认Any CPU,从组态管理员进去改)

( 注:EmguCV的载点在这里:https://sourceforge.net/projects/emgucv/ )

Step 1:安装 EmguCV

EmguCV 的安装很简单,一直按“下一步”就好。

安装完毕后,请新增两个环境变量:

C:Emguemgucv-windesktop 4.0.1.3373bin

C:Emguemgucv-windesktop 4.0.1.3373libsx64

Step 2:建立 C# 类库

夏恩先创建一个类库,名称叫做 lib_test:

创建类后,加入两个参考:

1. Emgu.CV.World.dll

该文件的位置在:C:Emguemgucv-windesktop 4.0.1.3373binEmgu.CV.World.dll

2. System.ServiceModel.dll

这个就比较难找了,以夏恩为例,路径如下:

C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5.2

再来是撰写程序:// C# code

// 说明:撷取 ipcam 影像供 MATLAB 使用

//

// 2019.06.19 Shayne

using System;

using Emgu.CV;

using Emgu.CV.Structure;

namespace ipcamPKG

{

public class ipcam

{

private Mat _frame = new Mat();

private VideoCapture _ipcam = null;

public Imageframe = null;

public int Height, Width;

public bool status = false;

public string ErrorMessage = "";

public ipcam(string URL)

{

try

{

_ipcam = new VideoCapture(URL);

if (_ipcam.IsOpened)

{

Height = _ipcam.Height;

Width = _ipcam.Width;

frame = new Image(Height, Width);

status = true;

_ipcam.ImageGrabbed += ProcessFrame;

// 若没有加入 System.ServiceModel.dll 的话,则无法成功启动摄影机

_ipcam.Start();

}

}

catch (Exception e)

{

ErrorMessage = e.Message;

status = false;

}

}

public void snapshot()

{

using (Imagetemp = _frame.ToImage())

{

try

{

frame = temp.Clone();

}

catch (Exception e)

{

ErrorMessage = e.Message;

status = false;

}

}

}

public void cvRelease()

{

_ipcam.Stop();

GC.Collect();

}

private void ProcessFrame(object sender, EventArgs arg)

{

_ipcam.Retrieve(_frame, 0);

}

}

}

写完之后,按下建置项目,就能把程序编译成类库,也就是 “.dll” 文件类型。

得到类库文件后,就可以在 MATLAB 内使用了!

在本范例中,建置完毕后您可以在 “.ipcamPKGbinx64Debug”中找到ipcamPKG.dll文件。

Step 3:撰写 MATLAB 程序

把刚才编译好的文件 ipcamPKG.dll,连同 Emgu.CV.World.dll,一起放到同一个地方。

MATLAB​ 所需相关工具箱:

MATLAB Compiler™ Toolbox

MATLAB Compiler SDK™ Toolbox% MATLAB code

% 说明:撷取 ipcam 示范程序

%

% 2019.06.19 Shayne

% Import .NET assembly

% 自定义类要使用绝对路径。

if exist([pwd, 'ipcamPKG.dll'], 'file')

NET.addAssembly( [pwd, 'ipcamPKG.dll'] );

else

uiwait(msgbox('ipcamPKG loading error!', 'ERROR', 'error'))

return

end

% 每间摄影机厂商的 URL 会不一样,请直接询问厂商正确的 URL。

URL = 'rtsp://admin:[email protected]/video.h264';

% 声明自定义类

% ipcamPKG 就是刚才自定义的 namespace

% ipcam 就是自定义的类名称

camera = ipcamPKG.ipcam(URL);

pause(1);

for i=1:10 % 撷取 10 次影像

% calling snapshot method

camera.snapshot();

% get image

I = flip(uint8(camera.frame.Data), 3);

% show image

imshow(I)

% 请注意:

% 若间隔时间若设定太短,容易会造成内存无法回收,导致电脑故障

pause(0.1)

end

% close the ipcam

camera.cvRelease();

搞定!如此一来,我们就能透过 C# 使得 MATLAB 可以撷取 H264 串流格式了!

感觉不赖吧!

小结

最后来讨论几个夏恩自己遇到的问题。

Q1:摄影机可以不要在建立对象时启动吗?我想手动开关!

Ans:

建议不要,常会有问题。

若直接在 MATLAB 中使用 VideoCapture 对象的方法 start(),只能抓到一帧影像且不会更新。

Q2:为什么要用 ImageGrabbed 事件?用 Grab 或是 QueryFrame 方法可以吗?

Ans:

可以,但是会有影像延迟的问题。

摄影机一旦启动,就会一直把数据送过来。

若让影像在 buffer 内堆的话,会导致影像产生延迟,类似的问题与讨论请看以下:

1. EmguCV/OpenCV QueryFrame slow/buffers

2. 【Python】改善 VideoCapture 的影像延迟

Q3:为什么要定义 frame 变量?让函数直接回传影像就好啦!

Ans:

就夏恩的经验来看,直接读取变量数据的程序写法比较简单。

有关 C# 与 MATLAB 影像交换的讨论,请看夏恩的另外一篇文章:

【Mixing】在 C# 与 MATLAB 间交换影像数据

当然了,若您想使用回传影像的方式也是可以,请自行尝试看看!OK的。

matlab获取ipv4地址,【MATLAB】从 IP camera 撷取影像相关推荐

  1. php跨网段获取mac地址吗,局域网IP地址和MAC地址绑定,跨网段IP-MAC绑定。

    局域网的IP地址和MAC地址绑定,一般选择在交换机或者路由器上进行配置.交换机的IP-MAC地址绑定一般是基于端口的.主要用于绑定各个交换机端口的IP地址/MAC地址.支持该功能的交换机不多,配置和维 ...

  2. python通过ip获取mac地址_Python3根据IP地址获取MAC地址

    这是一种笨方法,是根据系统内置命令去获取的.我只是抛砖引玉,希望有人给我分享更好的代码,比如通过ARP协议去获取MAC地址? 1.[代码][Python]代码 #!/usr/bin/env pytho ...

  3. python通过ip获取mac地址_通过IP或socket获取对方的MAC地址

    /* 链路层协议 */ #endif #include #define INLEN 4 #define MAC_BCAST_ADDR  (uint8_t *) "\xff\xff\xff\x ...

  4. matlab获取href,用 MATLAB 抓取网页数据小程序

    function main keyword = '方程'; url0 = 'https://www.ilovematlab.cn/forum-6-1.html'; % MATLAB 基础板块网址 % ...

  5. matlab获取视差图,Matlab生成视差图

    [实例简介] 双目视觉,根据块匹配方法的视差图生成.依据Matlab生成视差图. Dbasic= zeros(size(leftI),'single') disparity range 15; Sel ...

  6. matlab 获取edit,关于matlab的gui中获取edit值的问题

    本帖最后由 李昊波 于 2017-7-16 11:12 编辑 想请教一个问题,制作了一个有24个edit的gui程式,想获取edit中的数值然后用这些数值来做排列组合,但是运行结果显示为生成了一个空的 ...

  7. 爱快中的虚拟机不能获取IPV4地址

    创建虚拟机发现能获取路由器IPv4 自己尝试出的解决办法 因为之前只用到eth0~eth3作为LAN口,所以把eth4~eth5去掉了,所以再创建虚拟机就获取不到IPv4,我其实也不知道具体原理. 效 ...

  8. ipv4地址是几位二进制数_几张思维导图,让你清楚的知道ip地址怎么回事?

    网络工程中,ip地址是必须要了解的内容,今天我们用几张思维导图来给大家详细讲解IP地址. 一.什么是IP地址 在生活中我们使用具有上网功能的电子设备都有IP地址,就跟每个人都有自己的名字一样.IP地址 ...

  9. 获取Android 设备的WIFI IPv4地址

    一.前言 有时候需要获取Android设备的IPv4地址,可以通过下面列出的一种方法获取. 二.获取方法 // 获取IPv4地址private String getDeviceIPv4() {//获取 ...

最新文章

  1. 样式集(七)仿微信发现页样式
  2. 一次挂死(hang)的处理过程及经验
  3. mac上mysql8.0以tar.gz方式手动安装
  4. JavaScript高程第十章:DOM(上)
  5. JAVA线程的interrupt
  6. hbase里插入big int数据用Phoenix查看的报错问题
  7. 网易资深Java架构师:java数组对象转为list集合
  8. VIPKID:笔试题(数组中和为0的一对数的数量,十进制转二进制中1的个数)
  9. 人物和背景分离的快速方法
  10. 四川职称计算机英语,四川职称计算机考试报名细则
  11. python合并excel工作簿_使用python将excel工作簿工作表合并为一个工作表
  12. 国产商用密码与国际密码对照
  13. 计算log以二为底的x用计算机,计算器上怎么按出log以2为底的数
  14. python的Bio下的Entrez使用
  15. meltdown官方POC原理分析和踩过的坑
  16. 最新电影《D战》幕后真实案件:暗夜黑客组织被端
  17. 【esn】 学习回声状态网络
  18. Replication进阶(三) 复制心跳详解
  19. 计算机无法播放flash,Windows10系统电脑无法播放Falsh动画的解决方法
  20. eclipse全文搜索多个关键字

热门文章

  1. 机器学习分类光谱数据
  2. 时间计算题100道_2019消防工程师考试易考6大类型计算题
  3. 只狼服务器维修或停机,只狼存档怎么替换 只狼存档损坏修复方法介绍_游侠网...
  4. html直角三角形怎么实现,直角三角形怎么画
  5. 刚从阿里、头条面试回来,java处理excel文件数据
  6. 第一章 SQL中使用的符号
  7. 程序员非常实用的十个工具网站,值得收藏
  8. android技术篇(三)解密data区
  9. 基于阿里云的安全组介绍
  10. 阿里云安全组规则授权对象设置为固定IP段访问