0%

注1:适用编程语言: VC/C++、VB、C#、LabView等
注2:本说明仅提供C#编写的样板实例及原代码,仅用于通信测试,而其它编程语言请参考C#实例的参数设置,自行研习:

第一节:MX Component Version软件与手册下载

下载地址:
三菱MXComponent Version4

三菱MXComponent Version5
在这里插入图片描述
可供下载的是:MX组件版本4/5(中文版)
手册位置:
在这里插入图片描述

注3:本说明主要使用的是MX组件版本4编程手册(英文版),通信要用到的参数请在此手册中去查询.该手册支持FX5U相关参数,如有需要中文版本,可在三菱中文官网上自行下载.

第二节:MX Component Version 软件的使用与通信测试

在与上位机通信测试之前,首先与MX Component Version软件进行通信测试。

注:以下测试步骤Mx Component Version4与Mx Component Version5 没有多大区别

2.1 PLC以太网地址设置:

2.11 查询电脑的IP地址:

在win7 系统左下方,点击开始按钮,然后在搜索程序和文件选框中输入CMD,打开命令提示符窗口;
图2.11-1 打开命令提示符窗口
在命令提示符中输入 ipconfig,然后按回车键:
显示当前电脑的IP地址:
图2.11-2 在命令提示符窗口查询IP地址
因为当前样例的电脑IP为192.168.1.171;那么设置PLC的IP段则在192.168.1.0~192.168.1.255这个范围里。

注4:必须与电脑IP区别开来,不能写成一样的

2.12 打开GX works2 与PLC进行通信测试

注5:使用USB或串口(不能用网线)与电脑直连进行PLC的IP设置

打开GX Works2软件,然后点击新建(Ctrl+N):
图2.12-1 打开GX Works2软件
选择与目标PLC相同的型号,然后点击确定:
图2.12-2 选择系列与机型

注6:本样例是以Q26UDV为例来测试.

然后在导航栏选定连接目标,然后双击Connection1:
在这里插入图片描述
打开连接目标设置Connection1窗口进行设置:
在这里插入图片描述
双击计算机侧I/F的 Serial USB 图标:
在这里插入图片描述
选择USB连接选项,然后点击确定。
双击可编程控制器侧I/F栏 PLC Module图标:

在这里插入图片描述
在CPU模式的下拉选框里,选择QCPU(Q模式),然后点击确定。
双击其他站指定栏 No Specification 图标:在这里插入图片描述
根据需要来设定,然后点击确定。

注7:无特殊要求的话,选择默认即可

以上的设置完成后,然后单击通信测试(T)按钮,如果弹出以下的提示,则说明USB连接成功:
在这里插入图片描述
点击确定后,退出该设置界面。
然后在导航栏选定工程,然后双击PLC参数:
在这里插入图片描述
打开PLC参数设置界面,选择内置以太网端口设置,如下图所示:
在这里插入图片描述
当前样例的IP地址设置为192.168.1.39,其它的选择默认。

注8:保证IP地址的范围在【192.168.1.0~192.168.1.255】之间,且不与电脑IP相同即可

如果不确定你的输入是否与其它PLC地址有冲突,可点击检查进行确认。
如果输入无冲突将会有如下提示:
在这里插入图片描述
确认无误后,点击设置结束按钮退出PLC参数设置界面。

点击转换/编译(C),选择转换+编译(C)或者按F4快捷键进行编译转换。
在这里插入图片描述
然后点击PLC写入(W)按钮进行地址写入:
在这里插入图片描述
然后选择参数+程序选项,点击执行进行写入操作:
在这里插入图片描述
操作完成后,关闭GX Works2软件。拔掉USB线,换上网线,然后进行下一步操作。

2.13 测试PLC IP地址:

在命令提示符中输入 ping 192.168.1.39 测试连接状态:
在这里插入图片描述
出现以上的信息,则说是电脑与PLC连接成功。

2.2 打开MX Version4 软件进行组件与PLC间通信测试

2.21 MX Version4软件

在win7 系统左下方,点击开始按钮,然后单击所有程序,在下拉菜单中选择MELSOFT-MX Component-Communication Setup Utility,打开软件设置窗口:

注:以下软件测试步骤Mx Component Version4与Mx Component Version5 没有多大区别。

在这里插入图片描述

注9:为防止出现不必要的权限问题,请右键以管理员权限运行

打开如下图所示:
在这里插入图片描述
点击Wizard按钮,将出现以下界面:
在这里插入图片描述
Logical station number输入数字1即可,然后点击Next。
在这里插入图片描述
在PC side I/F 选择Ethernet board,如上图所示:
在这里插入图片描述
在Connect module 下拉选框中选择 CPU module,如上图所示,
在这里插入图片描述
在 Protocol 下拉选框中选择TCP。
下面的Time Out的值 默认值就可以了,也可以选填为10000ms
然后点击NEXT按钮,弹出如下图所示:
在这里插入图片描述
可以在Host(IP Address)一栏中输入192.168.1.39,或者点击Find CPU(Built-in Ethernet port) on network 按钮进行自动查找。出现如下图所示:
图2.21-8 Find CPU(Built-in Ethernet port
选中目标PLC的型号,然后点击OK.

注10:如有多个同时连接的话,请注意所选目标PLC是否匹配

如进行Find CPU(Built-in Ethernet port)这个动作的话,下图所示的界面的相关参数会自动填写,如没有,则需要手动进行选择。
在这里插入图片描述

注11:如有多个CPU同时组合的话,请确定当前目标放在几号位置,如只有单个的话,默认为None.

在这里插入图片描述
与之前的的Logical station number 保持一致。点击Finish按钮,返回。

在connetion test 界面,点击Test按钮 进行测试,如出现以下信息,则说明通信连接成功。

在这里插入图片描述
完成上面所示操作,如果流程没有出错,且出现上图所示信息,说明MX Component Version4/5的组件完全可用于上位机上。

第三节:C# 与PLC通信测试

3.1 以太网连接用到的参数列表:

ActCpuType CPU型号 int类型
ActUnitType 设备连接方式 int类型(即设备型号)
ActProtocolType TCP/UDP int类型
ActTimeOut 连接超时时间 int类型
ActHostAddress 设备IP地址 string类型
ActDestinationPortNumber 端口号 int类型
本样例以Q26UDV为例,可在MX Component Version4 编程手册中查询相关参数信息:

1.ActCpuType:

查手册可得:
ActCpuType=0xD5; 转换成十进制 ActCpuType=213
在这里插入图片描述

2.ActUnitType:

查手册可得:
ActCpuType=0x2c; 转换成十进制 ActCpuType=44

在这里插入图片描述

3.ActProtocolType

查手册可得:
ActProtocolType=0x05; 转换成十进制 ActProtocolType =5

在这里插入图片描述

4.ActTimeOut

查手册可得:
ActTimeOut=10000 ms;
在这里插入图片描述

5.ActHostAddress

之前设置的PLC的IP地址为:192.168.1.39;

6.ActDestinationPortNumber

查手册可得:
ActDestinationPortNumber=5562;默认值为0;可以自己设定,但是对数据进行读写操作时,端口号要保持一致.
在这里插入图片描述

注:以上参数可通用,Mx Component Version4与Mx Component Version5 不同在于dll的引用方法不一样,具体方法可借鉴官方样例文档。
注:官方样例路径在 C:\MELSEC\Act\Samples\Vcs.NET\Act_2019文件夹下

3.2 C# winform界面

3.21 C# 程序实现组件引用

32位引用方法:
在这里插入图片描述
与PLC通信相关的组件具体两个文件在文件夹中体现的是:
在这里插入图片描述
工具箱中添加选项卡:

在这里插入图片描述
选择ActProgType Control v1.0 组件
在这里插入图片描述
点击确定后,在工具箱中会多出如下图所示的控件:
在这里插入图片描述
将如上图所示的控件用鼠标拖到窗体中,系统将自动引用如下图所示的两个组件:
在这里插入图片描述
其他的具体参考样例原代码

64位引用:
在这里插入图片描述

右键点击引用,选择浏览,找到上面的ActProgType64.exe文件,点击确定,将出现以下组件:
在这里插入图片描述

注I:如以上操作在文件执行时出现异常,强烈建议关闭杀毒软件;
注II:如在类库中引用此ActProgType64.exe文件,生成可引用的dll时,请将目标平台设成Any CPU,不要设置成X64(如果您现在使用的是最新的VS2022,请无视此注);

3.22 C# Demo样例窗体:

在这里插入图片描述
样例程序代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
namespace Demo
{
public partial class Form1 : Form
{
ActProg actprog = new ActProg();
public Form1()
{
InitializeComponent();
}

private void TB_CpuType_TextChanged(object sender, EventArgs e)
{

actprog.CpuType = Convert.ToInt32(TB_CpuType.Text.Trim());
}

private void TB_UnitType_TextChanged(object sender, EventArgs e)
{
actprog.UnitType = Convert.ToInt32(TB_UnitType.Text.Trim());
}

private void TB_HostAddress_TextChanged(object sender, EventArgs e)
{
actprog.HostAddress = TB_HostAddress.Text.Trim();
}

private void TB_ProtocolType_TextChanged(object sender, EventArgs e)
{
actprog.ProtocolType = Convert.ToInt32(TB_ProtocolType.Text.Trim());
}

private void TB_TimeOut_TextChanged(object sender, EventArgs e)
{
actprog.TimeOut = Convert.ToInt32(TB_TimeOut.Text.Trim());
}

private void button1_Click(object sender, EventArgs e)
{
if (actprog.Open()==0)
{
MessageBox.Show("连接成功");
}
else
{
MessageBox.Show("连接失败");
}
}

private void button2_Click(object sender, EventArgs e)
{
actprog.Open();
textBox1.Text= actprog.Read("D1000");
actprog.Close();
}

private void button3_Click(object sender, EventArgs e)
{
actprog.Open();
string send= actprog.Write(textBox2.Text.Trim(),"D1000");
MessageBox.Show(send);
actprog.Close();
}

private void TB_DestinationPortNumber_TextChanged(object sender, EventArgs e)
{
actprog.DestinationPortNumber = Convert.ToInt32(TB_DestinationPortNumber.Text.Trim());
}
}
}

测试连接结果如下:
在这里插入图片描述
写发送:
在这里插入图片描述
读接收:
在这里插入图片描述
ActProgTypeLib类使用代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
namespace CL_Enet
{
public class ActProg
{
private ActProgTypeClass Aptc= new ActProgTypeClass();
#region //定义参数
private int _cpuType;
[Description("CPU型号")]
public int CpuType
{
get { return _cpuType; }
set { _cpuType = value; }
}

private int _unitType;
[Description("设备连接方式")]
public int UnitType
{
get { return _unitType; }
set { _unitType = value; }
}

private int _protocolType;
[Description("TCP/UDP")]
public int ProtocolType
{
get { return _protocolType; }
set { _protocolType = value; }
}

private int _timeOut;
[Description("连接超时时间")]
public int TimeOut
{
get { return _timeOut; }
set { _timeOut = value; }
}
private string _hostAddress;
[Description("设备IP地址")]
public string HostAddress
{
get { return _hostAddress; }
set { _hostAddress = value; }
}
#endregion
private int _destinationPortNumber;
public int DestinationPortNumber
{
get { return _destinationPortNumber; }
set { _destinationPortNumber = value; }
}

#region //定义连接状态
//int CpuType, int UnitType, int ProtocolType,int TimeOut,string HostAddress
public int Open()
{
try
{
Aptc.ActCpuType = _cpuType;
Aptc.ActUnitType = _unitType;
Aptc.ActProtocolType = _protocolType;
Aptc.ActTimeOut = _timeOut;
Aptc.ActHostAddress = _hostAddress;
Aptc.ActDestinationPortNumber = _destinationPortNumber;
return Aptc.Open();

}
catch (System.Exception ex)
{
return -1;
}
}

public int Close()
{
return Aptc.Close();
}

public string Read(string RegiseterName)
{
int iReturnCode = -1;//返回值=0表示读取成功
int length = System.Text.RegularExpressions.Regex.Split(RegiseterName, "\n").Length;
int iNumberOfData = length;
int[] iData = new int[length];//读取软元件值
iReturnCode = Aptc.ReadDeviceRandom(RegiseterName, iNumberOfData, out iData[0]);
if (iReturnCode == 0)
{
return iData[0].ToString();
}
else
{
return "";
}
}
public string Write(string value,string RegiseterName)
{
int iReturnCode = -1;//返回值=0表示写入成功
string[] strArray = System.Text.RegularExpressions.Regex.Split(value, "\n");//拆分写入寄存器列表
int iNumberOfData = strArray.Length;//szLabel.IndexOf("\n", 0) + 1;//写入点数
int[] iData = new int[strArray.Length];//写入软元件值
for (int i = 0; i < strArray.Length; i++)
{
iData[i] = Int32.Parse(strArray[i]);
}
iReturnCode = Aptc.WriteDeviceRandom(RegiseterName, iNumberOfData, ref iData[0]);
if (iReturnCode == 0)
{
return value;
}
else
{
return "error";
}
}
#endregion
}
}

结束语

此样例仅提供思路参考,上述样例代码仅适用三菱PLC与上位机软件

  1. 查看本地git绑定的用户名和邮箱:

git config user.name

git config user.email

生成SSH密钥

1、查看是否已经有了ssh密钥

1
cd ~/.ssh

​ 如果没有密钥则不会有此文件夹,如果有,请按需操作

2、生成SSH密钥文件

1
ssh-keygen -t rsa -C "user.email"

​ 请将user.email 替换成你自己的邮箱

3、默认密码为空,一直按Enter,直到生成文件为止;

4、在github上添加ssh,将生成的id_rsa.pub里面的公钥内容复制到git库中我的SSHKEYS

5、测试:

1
ssh git@github.com
  1. ① 修改本地git绑定的用户名和邮箱(全局):

git config --global user.name “chustange”

git config --global user.email “chustange@163.com”

​ ② 根据不同的项目绑定不同的用户名和邮箱:进入项目根目录(去掉–global即可):

git config user.name “chustange”

git config user.email “chustange@163.com”

  1. 克隆现有的仓库,若没有自定义本地仓库名称,则默认远程仓库名称

git clone 远程仓库URL (本地仓库自定义名称)

  1. 查看仓库所有分支

git branch -a

  1. 新建分支并切换至新分支:

git checkout -b 分支名

  1. 推送本地分支到远程分支(远程分支与本地分支同名):

git push origin 分支名:分支名

  1. 让本地分支与远程分支建立关联:

git branch --set-upstream-to=origin/分支名

注:如第七步操作未执行,拉取远程代码需执行:git pull origin 分支名,需标明拉取远程的具体分支名。

  1. 查询所有分支

git branch -a

  1. 切换至其他分支:

git checkout 分支名

  1. 删除分支:先切换到非删除的分支,同个分支一般先删除远程分支再删除本地分支

①删除远程分支

git push origin --delete 分支名

②删除本地分支

git branch -d XX :普通删除分支
git branch -D XX :强制删除分支

  1. 查看本地仓库当前代码状态:

git status

  1. 添加要提交的代码文件

①添加所有文件:

git add .

②自定义添加多个文件,文件之间用空格隔开:

git add file1 file2 file3

  1. 提交到本地仓库:

git commit -m “描述语句”

  1. 执行第13点后,要执行一下 git pull,合并分支最新代码,查看是否会冲突,若会冲突:

方法①:点进冲突文件进行修改冲突的代码然后再重新执行第12点;

方法②:回滚代码:

  1. git stash //这是将本地代码回滚至上一次提交的时候,就是没有自己新改的代码;
  2. git pull origin 分支名//将远程的代码拉下来,“origin 分支名”一般可以省略;
  3. git stash pop //将上面git stash回滚的代码释放出来,相当于将自己修改的代码与下拉的代码合并;
  4. 重新从第12点开始执行;

14、push到远程仓库:

git push origin 分支名//将远程的代码上传上去,“origin 分支名”一般可以省略;

15、合并分支代码:如main分支合并至dev分支,则先切换至dev分支:

git merge main //表示将main分支合并至dev分支

打开README.md修改冲突内容,然后再提交按第12、13、14、15点:

关于三菱RJ71EIP91 FB模块从Class1升级到Class3的办法

近期有客户咨询相关FB模块如何升级的问题,已经解决了相关问题,在此做个记录

准备工作

1、此次 RJEIP91 FB模块是基于GX Works3软件上面使用

GX Works3 的版本建议使用最新版

2、由三菱提供的最新的RJ71EIP91_Class3对应文件

如有需要的客户,请致电联系深圳市海蓝智能科技有限公司索取

image-20230519140735200 以上`Manual`文件夹中包含 `RJ71EIP91_Class3TAG_手册` 以及`UnitLabelFB`文件夹中包含的此次所需的FB模块文件 `RJ71EIP91.mslu` image-20230519141107822

上述文件中,在UnitLabelFB文件夹中包含了批处理文件,由于GX Works3安装的位置不同,会导致批处理无法生效;将上述文件提供给客户,可能会因为权限或者安装路径等问题不能成功安装;

在此提供一个简单有效的方法,就是把上面的FB模块文件 RJ71EIP91.mslu直接复制到相应的位置,这也是上面bat批处理文件中所做的事情;

软件流程操作

如果对GX Works3软件的操作非常熟悉请直接跳过此过程;

1、检查当前的RJ71EIP91模块流程
1、新建空白工程,如下图所示:
image-20230519112104785 ###### 2、在左侧导航栏中找到模块信息栏,如下图所示 image-20230519112459323 ###### 3、右键鼠标`添加新模块(U)`,如下图所示 image-20230519112306240 ###### 4、直接搜索`RJ71EIP91`,或者选择模块的类型为`网络模块`,然后在模块型号的下拉列表中选择`RJ71EIP91`点击确定,如下图所示; image-20230519112345942 ###### 5、在`部件选择`栏的`模块`栏中可以看到`模块FB`中的`RJ71EIP91`内容,如下图所示: image-20230519112017606

替换操作

如果电脑中安装了Listary 或者 Everything软件的话,直接打开软件搜索 RJ71EIP91.mslu或者.mslu直接定位到对应的目录,相对路径是\MSF\Common\Library\UNITFB\

根据安装路径去到相应位置查找,三菱软件的安装目录默认一般在C:\Program Files (x86)\MELSOFT
image-20230519143649100

也有可能在C:\MELSEC,如下图所示

image-20230519143945701

查询到的内容如下图所示:

image-20230519113846229

然后将上述的RJ71EIP91.mslu文件进行覆盖替换

替换前,请将之前的RJ71EIP91.mslu做好备份,如不需要,再替换回去即可

如果上述路径都不存在,也没有安装Listary 或者 Everything软件请在电脑中全局搜索RJ71EIP91.mslu或者.mslu,此过程比较慢,请耐心等待

替换完成后,请跳转到 C:\Program Files (x86)\MELSOFT\GPPW3,如下图所示:

image-20230519152609919

请执行一次GXW3PluginPreloader.exe将此插件进行预加载,然后打开GX Works3软件添加此模块,然后在部件选择栏的模块栏中可以看到模块FB中的RJ71EIP91更新后的内容,如下图所示:

image-20230519114301121

执行完成后,如果还没有更新出以上的内容,请记得关机重启再试一次

1、在进行数据库表更新时出现以下错误提示

Database operation expected to affect 1 row(s) but actually affected 0 row(s).
存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。

贴出来的出错代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 //配方表信息
TempVisionFormula = new Entities.VisionFormula()
{
DateTime = exists.Content[0].DateTime,
Guid = exists.Content[0].Guid,
Name = exists.Content[0].Name,
Description = richTextBox1.Text,
Width = width,
Height = height,
HoleCount = holecount,
XOffset = 0d,
UpdateDateTime = DateTime.Now,
};
//将此配方添加至数据库中
var result = sql.Update(TempVisionFormula);

数据库的更新方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
protected override Result Update(VisionFormula data)
{
try
{
interlocked.Enter();
if (data.IsNullOrEmpty()) return Result.Error();
using var context = new HiContext();
context.Formulas.Attach(data);
context.Entry(data).Property(l => l.Guid).IsModified = false;
context.Entry(data).Property(l => l.DateTime).IsModified = false;
context.Entry(data).Property(l => l.Name).IsModified = true;
context.Entry(data).Property(l => l.UpdateDateTime).IsModified = true;
context.Entry(data).Property(l => l.Description).IsModified = true;
context.Entry(data).Property(l => l.XOffset).IsModified = true;
context.Entry(data).Property(l => l.Width).IsModified = true;
context.Entry(data).Property(l => l.Height).IsModified = true;
context.Entry(data).Property(l => l.Count).IsModified = true;
context.SaveChanges();
return Result.Successed();
}
catch (Exception ex)
{
ex.Error(StackTrace.LineNumber());
return Result.Error(ex);
}
finally
{
interlocked.Exit();
}
}

错误分析:

由于更新时,没有将表的Id填写上去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//配方表信息
TempVisionFormula = new Entities.VisionFormula()
{
//添加此项就OK了
FormulaId = exists.Content[0].FormulaId,
DateTime = exists.Content[0].DateTime,
Guid = exists.Content[0].Guid,
Name = exists.Content[0].Name,
Description = richTextBox1.Text,
Width = width,
Height = height,
HoleCount = holecount,
XOffset = 0d,
UpdateDateTime = DateTime.Now,
};
//将此配方添加至数据库中
var result = sql.Update(TempVisionFormula);

在从A电脑中拷贝备份数据库到B电脑相应路径下还原数据库,出现数据库还原失败System.Data.SqlClient.SqlError 无法执行 BACKUP LOG,因为当前没有数据库备份的错误提示

解决方法

取消结尾日志备份下的还原前进行结尾日志备份(T)的勾选,将还原选项中的覆盖现有数据库(WITH REPLACE)(O)进行勾选,如下图所示:

在执行备份数据库是看不到Backup文件下的备份文件

1、右键当前数据库,然后点击 任务(T) ,在扩展候选中选择备份(B):

2、在备份数据库页面,选择添加(D)...按钮:

3、在选择备份目标页面,选择...按钮,打开选择目标路径:

4、 选择MSSQL16.MSSQLSERVER 下面的MSSQLBackup文件夹下:输入所需要的备份名称

正常情况下应该是这样的:

原因分析:由于MSSQLSERVER没有相应的权限,导致不能正常显示

打开目录所在位置C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL

右键选择属性

在Backup属性页面中选择编辑(E)...,然后点击添加(D)...:

在选择用户或组页面中输入对象名称来选择(示例)(E)中输入 NT SERVICE\MSSQLSERVER 后点击 确定

选择 MSSQLSERVER然后点击 确定,然后附加权限,点击应用(A)

再次打开,就可以正常显示Buckup里面的内容

注:如果当前用户下无法打开文件夹,请按照以上的操作来添加相应的用户和组,比如我的用户名为汤雄兵(chustange@outlook.com),添加后就可以打开了

对在MarkDown格式下的数学公式资料进行归档,持续更新整理中

阅读全文 »

binomial_filter(操作员)

名字

binomial_filter— 使用二项式滤镜平滑图像。

签名

1
**binomial_filter**(*Image* : *ImageBinomial* : *MaskWidth*, *MaskHeight* : )

描述:

binomial_filter平滑图像Image使用掩码大小为MaskWidth * MaskHeight像素,并返回ImageBinomial.二项式滤波器是高斯滤波器的一个非常好的近似值,仅使用整数运算即可非常有效地实现。因此,非常快。设 m =binomial_filterMaskHeight和 n =MaskWidth.然后,滤波系数bij由二项式系数(kl)=l!k!(1k)!给出

如下:

$b_ij=\frac{1}{2{n+m-2}}({m-1}_i)(^{n-1}_j)$

在这里,i = 0, …, m-1 和 j = 0, …, n-1。二项式滤波器执行与高斯滤波器大致相同的平滑处理,其σ=n12,其中为简单起见,假定 m = n。具体而言,n和σ之间的关系是:

nσ
30.7523
51.0317
71.2505
91.4365
111.6010
131.7502
151.8876
172.0157
192.1361
212.2501
232.3586
252.4623
272.5618
292.6576
312.7500
332.8395
352.9262
373.0104

如果为MaskHeightMaskWidth,n 和σ之间的上述关系仍然保持并引用行和列方向中的平滑量。

binomial_filter可以在 OpenCL 设备上为所有受支持的映像类型执行。

有关平滑滤镜概念的说明,请参阅“滤镜/平滑”一章的介绍。

注意

请注意,如果使用具有简化域的图像作为输入,则滤镜运算符可能会返回意外结果。请参阅过滤器一章。

执行信息

  • 支持开放CL计算设备。
  • 多线程类型:重入(与非独占运算符并行运行)。
  • 多线程范围:全局(可以从任何线程调用)。
  • 在元组级别自动并行化。
  • 在通道级别自动并行化。
  • 在域级别自动并行化。

参数

Image(input_object)((multichannel-)image(-array) object (byte* / uint2* / real*) *允许用于计算设备

输入图像。

ImageBinomial(output_object)(multichannel-)image(-array) object (byte / uint2 / real)

平滑图像。

MaskWidth(input_control)integer (integer)

筛选器宽度。

**默认值:**5

值列表: 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37

MaskHeight(input_control)integer (integer)

滤镜高度。

**默认值:**5

值列表: 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37

结果

如果参数值正确,则运算符返回值 2(H_MSG_TRUE)。空输入(没有可用的输入图像)时的行为通过运算符设置binomial_filter[set_system('no_object_result',<Result>)].如有必要,将引发异常。

可能的前身

read_image,grab_image

可能的继任者

regiongrowing ,threshold,sub_image,dyn_threshold,auto_threshold

选择

gauss_filter,smooth_image,derivate_gauss,isotropic_diffusion

另请参见

mean_image,anisotropic_diffusion,sigma_image,gen_lowpass

模块

基础

fill_interlace(算子)

名字

fill_interlace— 插值 2 个视频半图像。

签名

fill_interlace(ImageCamera : ImageFilled : Mode : )

描述

算子计算插值的完整图像,或从由两个半图像组成的视频图像中删除奇数/偶数行。如果使用摄像机记录图像,则它由在不同时间记录的两半图像组成,但以数字形式存储在一个图像中。这可能会导致进一步处理中的多个错误。为了减少这些错误,修改了视频图像。每隔一行就会被重新计算或删除。参数fill_interlaceMode确定是否必须对偶数(“偶数”、“有效”)或奇数(“奇数”、“rmodd”)行号执行此操作。如果选择“偶数”或“奇数”,则生成的行中的灰度值将分别计算为当前像素上方或下方的直接相邻节点的平均值。如果选择“rmeven”或“rmodd”,则会删除偶数或奇数行数(在这种情况下,生成的图像仅是输入图像的一半)。的值“开关”Mode使奇数线和偶数线被交换。

有关平滑滤镜概念的说明,请参阅“滤镜/平滑”一章的介绍。

注意

请注意,如果使用域缩小的图像(即使用*reduce_domain*处理过的图像)作为输入,则滤镜运算符可能会返回意外结果。请参阅过滤器一章。

执行信息

  • 多线程类型:重入(与非独占运算符并行运行)。
  • 多线程范围:全局(可以从任何线程调用)。
  • 在元组级别自动并行化。
  • 在通道级别自动并行化。
  • 在域级别自动并行化。

参数

ImageCamera(input_object)(多通道)图像(数组)对象(字节/新 2)

灰色图像,由两个半图像组成。

ImageFilled(output_object)(多通道)图像(数组)对象(字节/新 2)

带有插值/删除线的完整图像。

Mode(input_control)字符串 (字符串)

指示是否应替换/删除偶数行或奇数行。

默认值: “奇数”

值列表:“偶数”,“奇数”,“精灵”、“rmodd”、“切换”

示例(软件开发)

1
2
3
read_image(Image,'video_image')
fill_interlace(Image,New,'odd')
sobel_amp(New,Sobel,'sum_abs',3)

复杂性

对于每个像素:O(2)。

结果

如果参数值正确,则运算符返回值 2(H_MSG_TRUE)。空输入(没有可用的输入图像)时的行为通过运算符设置fill_interlaceset_system('no_object_result',).如有必要,将引发异常。

可能的前身

1
read_image`,`grab_image

可能的继任者

sobel_amp,edges_image,regiongrowing,diff_of_gauss,threshold,dyn_threshold,auto_threshold,mean_image,binomial_filter,gauss_filter,anisotropic_diffusionsigma_imagemedian_image

另请参见

1
median_image`, , ,`binomial_filter``gauss_filter``crop_part

模块

基础