matlab获取ipv4地址,【MATLAB】从 IP camera 撷取影像
用 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 撷取影像相关推荐
- php跨网段获取mac地址吗,局域网IP地址和MAC地址绑定,跨网段IP-MAC绑定。
局域网的IP地址和MAC地址绑定,一般选择在交换机或者路由器上进行配置.交换机的IP-MAC地址绑定一般是基于端口的.主要用于绑定各个交换机端口的IP地址/MAC地址.支持该功能的交换机不多,配置和维 ...
- python通过ip获取mac地址_Python3根据IP地址获取MAC地址
这是一种笨方法,是根据系统内置命令去获取的.我只是抛砖引玉,希望有人给我分享更好的代码,比如通过ARP协议去获取MAC地址? 1.[代码][Python]代码 #!/usr/bin/env pytho ...
- python通过ip获取mac地址_通过IP或socket获取对方的MAC地址
/* 链路层协议 */ #endif #include #define INLEN 4 #define MAC_BCAST_ADDR (uint8_t *) "\xff\xff\xff\x ...
- matlab获取href,用 MATLAB 抓取网页数据小程序
function main keyword = '方程'; url0 = 'https://www.ilovematlab.cn/forum-6-1.html'; % MATLAB 基础板块网址 % ...
- matlab获取视差图,Matlab生成视差图
[实例简介] 双目视觉,根据块匹配方法的视差图生成.依据Matlab生成视差图. Dbasic= zeros(size(leftI),'single') disparity range 15; Sel ...
- matlab 获取edit,关于matlab的gui中获取edit值的问题
本帖最后由 李昊波 于 2017-7-16 11:12 编辑 想请教一个问题,制作了一个有24个edit的gui程式,想获取edit中的数值然后用这些数值来做排列组合,但是运行结果显示为生成了一个空的 ...
- 爱快中的虚拟机不能获取IPV4地址
创建虚拟机发现能获取路由器IPv4 自己尝试出的解决办法 因为之前只用到eth0~eth3作为LAN口,所以把eth4~eth5去掉了,所以再创建虚拟机就获取不到IPv4,我其实也不知道具体原理. 效 ...
- ipv4地址是几位二进制数_几张思维导图,让你清楚的知道ip地址怎么回事?
网络工程中,ip地址是必须要了解的内容,今天我们用几张思维导图来给大家详细讲解IP地址. 一.什么是IP地址 在生活中我们使用具有上网功能的电子设备都有IP地址,就跟每个人都有自己的名字一样.IP地址 ...
- 获取Android 设备的WIFI IPv4地址
一.前言 有时候需要获取Android设备的IPv4地址,可以通过下面列出的一种方法获取. 二.获取方法 // 获取IPv4地址private String getDeviceIPv4() {//获取 ...
最新文章
- 样式集(七)仿微信发现页样式
- 一次挂死(hang)的处理过程及经验
- mac上mysql8.0以tar.gz方式手动安装
- JavaScript高程第十章:DOM(上)
- JAVA线程的interrupt
- hbase里插入big int数据用Phoenix查看的报错问题
- 网易资深Java架构师:java数组对象转为list集合
- VIPKID:笔试题(数组中和为0的一对数的数量,十进制转二进制中1的个数)
- 人物和背景分离的快速方法
- 四川职称计算机英语,四川职称计算机考试报名细则
- python合并excel工作簿_使用python将excel工作簿工作表合并为一个工作表
- 国产商用密码与国际密码对照
- 计算log以二为底的x用计算机,计算器上怎么按出log以2为底的数
- python的Bio下的Entrez使用
- meltdown官方POC原理分析和踩过的坑
- 最新电影《D战》幕后真实案件:暗夜黑客组织被端
- 【esn】 学习回声状态网络
- Replication进阶(三) 复制心跳详解
- 计算机无法播放flash,Windows10系统电脑无法播放Falsh动画的解决方法
- eclipse全文搜索多个关键字