当前位置:文档之家› labview数组、簇和图形的区别

labview数组、簇和图形的区别

labview数组、簇和图形的区别
labview数组、簇和图形的区别

数组是同类型元素的集合。一个数组可以是一维或者多维,

如果必要,每维最多可有231-1个元素。可以通过数组索引访问

其中的每个元素。索引的范围是0到n – 1,其中n是数组中

元素的个数。图3-1所显示的是由数值构成的一维数组。注意

第一个元素的索引号为0,第二个是1,依此类推。数组的元素

可以是数据、字符串等,但所有元素的数据类型必须一致。

图3-1数组示意图

簇(Cluster)是另一种数据类型,它的元素可以是不同类

型的数据。它类似于C语言中的stuct。使用簇可以把分布在流

程图中各个位置的数据元素组合起来,这样可以减少连线的拥挤

程度。减少子VI的连接端子的数量。

波形(Waveform)可以理解为一种簇的变形,它不能算是一种有普遍意义的数据类型,但非常实用。

3.2数组的创建及自动索引

3.2.1创建数组

一般说来,创建一个数组有两件事要做,首先要建一个数组的“壳”(shell),然后在这个壳中置入数组元素(数或字符串等)。

如果需要用一个数组作为程序的数据源,可以选择

Functions?Array?Array Constant,将它放置在流程图中。然后

再在数组框中放置数值常量、布尔数还是字符串常量。下图显示

了在数组框放入字符串常量数组的例子。左边是一个数组壳,中

间的图上已经置入了字符串元素,右边的图反映了数组的第0个

元素为:”ABC”,后两个元素均为空。

图3-1数组的创建

在前面板中创建数组的方法是,从Controls模板中选择

Array & Cluster,把数组放置在前面板中,然后选择一个对象

(例如数值常量)插入到数组框中。这样就创建了一个数值数组。

也可以直接在前面板中创建数组和相应的控制对象,然后将

它们复制或者拖曳到流程图中,创建对应的常数。

还有很多在流程图中创建和初始化数组的方法,有些功能函

数也可以生成数组。

3.2.2数组控制对象、常数对象和显示对象

通过把数组与数值、布尔数、字符串或者簇组合在一起,可以在前面板和流程图中创建任何一种控制对象、常数对象和显示对象。数组元素不能是数组、图表或者图形。如果您想查看一些数组的例子,请查看Examples\General\arrays.llb中的例子。

3.2.3自动索引

For循环和While循环可以自动地在数组的上下限范围内编索引和进行累计。这些功能称为自动索引。在启动自动索引功能以后,当把某个外部节点的任何一维元素连接到循环边框的某个输入通道时,该数组的各个元素就将按顺序一个一个地输入到循环中。循环会对一维数组中的标量元素,或者二维数组中的一维数组等编制索引。在输出通道也要执行同样的工作――数组元素按顺序进入一维数组,一维数组进入二维数组,依此类推。

在默认情况下,对于每个连接到For循环的数组都会执行自

动索引功能。可以禁止这个功能的执行,方法是用鼠标右键单击

通道(输入数组进入循环的位置),在快捷菜单中选择Disable

Indexing。

练习3-1创建一个自动索引的数组

目的:使用 For 循环的自动索引功能创建数组,并用一个图形(Graph)显示该数组。

前面板

图3-2练习3-1的面板

1.打开一个新的前面板。

2.选择Controls?Array & Cluster,在前面板

中放置一个数组。设置它的标签为Waveform Array。

3.选择Controls?Numeric,在

数组框中插入一个数字式显示对象。

如右图所示。它用于显示数组的内容。

4.选择Controls?Graph,在前

面板中放置一个波形图。设置它的标

签为Waveform Graph。

5.隐藏图例和模板。

6.用鼠标右键单击图形,并在快捷菜单中取消选中Y

Scale?Autoscale Y,禁止自动坐标功能。

7.使用文本工具,把Y轴的范围改为-0.5到1.5。

流程图

8.按照下图创建流程图。

图3-2练习3-1的流程图

●由Functions?Select a VI…寻找

LabVIEW\activity目录下的Generate Waveform

VI,它的作用是返回波形中的某一点。这个VI

需要输入一个索引,我们将循环周期连接到这个

输入。

●注意Generate Waveform VI连出来的连线在循环边界

变成一个数组时会变粗,正是在这个边界处形成了一维数组。

●For循环会自动累计边界内的数组。这种功能叫做自动

索引。在这个例子中,连接到循环计数输入的数值常数令For

循环创建了一个由100个元素组成的数组。

●Bundle函数(Functions? Cluster)——

将图块中的各个组件组合成一个簇,在正确连接以

前需要改变该函数的图标的大小。将移位工具放在

图标的左下角。变形工具会变成如左图所示,拖曳鼠标直到出现

第三个输入端子。

●数值常数(Functions?Numeric)——三个数值常数用

于设置For循环执行的周期数N=100,初始X=0和delta X=1。

9.从前面板执行该VI。该VI将把自动索引后的波形图数

组显示在波形图中。

10.把 X的delta值改为0.5,X的初始值改为20。再次执

行该VI。注意,波形图现在同样显示100个点,而每个点的初

始值为20,X的delta值为0.5(见X轴)。

11.只需在显示器中输入元素的索引号就可以查看波形数

组中的任何元素。如果输入的数比数组的元素个数大,那么显示

器将变暗,表示您没有为该元素设置索引。

如果需要一次查看多个元素,可以通过改变数组显

示对象的大小来实现。把定位工具放置在数组框的右下

角。工具将变成右图所示的变形工具。当工具变形时,用鼠标拖

曳数组的右边或者下边。数组现在就可以按照元素索引的上升顺

序显示多个素,以某个与指定索引对应的元素开始,如下图所示。

图3-3练习3-1中多个数组元素的同时观察

在前面的流程图中,您为波形图指定了初始的X值和delta

X值。默认的X初始值是0,delta X 值是1。这样,也可以把

波形数组直接连接到波形图端子,而无需指定初始的X值和

delta X值,如图3-4所示。

图3-4练习3-1使用默认X及Delta X时简化后的流程图

12.按上图删除 Bundle功能函数和它所连接的常数对象。

方法是用移位工具选择该功能函数和连接的常数对象,按下

。再选择Edit?Remove Bad Wire s。按照上图完成流程

图的连线。

13.执行该VI。注意初始的X值是0,delta X值是1。

多图区图形

可以创建含有多条曲线的图形,方法是创建一个数组,用它

来汇集传给单图区图形的类型的数据元素。

图3-5 练习3-1多图区图形的流程图

14. 按照上图创建流程图。

● 正弦函数

(Functions?Numeric?Trigonometric )——在这

里,它用于在For 循环中创建一个由数据点组成的数组,表示一

个正弦波周期。

● Pi 常数(Functions?Numeric?Additional

Numeric Constants )

● Build Array (Functions?Arra y )——在

这里,它用于创建合适的数据结构(一个二维数组),

在波形图中绘制两条曲线。。用移位工具拖曳边角

可以增大该函数的面积,创建两个输入端子。

15. 返回前面板,执行该 VI 。注意同一个波形中的两个图

区。默认情况下,它们的X 初始值都是0,delta X 初始值都是

1。下图是该程序的运行结果(前面板未改动)。

16. 把该VI 保存为LabVIEW\Activity 目录中的Graph

Waveform Arrays.vi 。

17. 可以修改图形中的某个图区的外观。方法是,用鼠标右

键单击这个图形,再从弹出菜单选择对应的图例。

Array

图3-6 练习3-1多图区图形的面板显示

练习 3-1 结束。

在上面这个例子中,由于计算端子连接了一个值为100的常

数对象,所以 For 循环将执行100次。下面这个例子显示了另

外一种控制循环执行次数的方法。

更详细的例子建议调阅Examples 》Fundamentals 》Graphs

and Charts 》Graph Examples 》Waveform Graph 例子。

练习 3-2 对输入数组使用自动索引功能

目的:打开并执行一个VI ,它将在一个For 循环中使用自动索引功能处理一个数组。

1. 选择File?Open …,打开

Examples\General\arrays.llb 中的Separate Array Values

VI 。

2.打开流程图。下面的示意图显示的是在TRUE和FALSE

时的情况。

图3-7练习3-2的流程图

注意,Input Array引出的连线与For循环外的粗线不同,

表示这是一个数组,而循环内部的细线则表示这是一个数组元

素。数组元素在每个循环期间将自动编号。

用自动索引功能设置 For 循环的计数器

注意,计数器端子还没有连线。当您对某个进入For

循环的数组使用自动索引功能时,循环就将根据数组的大小执行

相应的次数,这样就无需连接某个值到计数器的端口。如果对一

个以上的数组使用自动索引功能,或者在使用自动索引功能之外

还需要设置计数器时,实际的循环次数将是其中最小的数。

3.执行该VI。在输入的八个数中,可以看到4个属于正

数数组,另外4个属于负数数组。

4.从流程图中将一个值为5的常数对象连接到For 循环

的计数器端子。执行该 VI。可以看到尽管输入数组仍然有八个

元素,但是3个位于正数数组,另外2个位于负数数组。这说明,

如果设置了N并开启了自动索引功能,那么实际循环的次数将取

较小的数。

5.关闭该VI,不要保存任何修改。

注:练习3-2的算法说明

下面是一段伪代码,解释上面的算法,假定输入数组为A(已

赋值),B(正数)、C(负数)。Sbr 、Scr分别是与B数组、

C数组对应的右寄存器数组,Sbl 、Scl分别是与B数组、C数

组对应的左寄存器数组,size运算为测数组实际大小,ins运算

为将一个数插入数组中最左边的空位。

练习3-2结束。

3.3数组功能函数

LabVIEW提供了很多用于操作数组的功能函数,位于

Functions?Array中。其中包括Replace Array Element,、Search 1D

Array、Sort 1D Array、Reverse 1D Array和Multiply Array

Elements等等。

创建数组——Build Array函数(Functions?Array),用于根据标量值或者其他的数组创建一个数组。

开始时,Build Array函数具有一个标量输入端子。您可以根据需要向该功能函数中加入任意数量的输入,输入可以是标量或者数组。如果要添加其他的输入,用鼠标单击函数的左侧,在弹出菜单中选择Add Element Input或者Add Array Input。还可以用变形工具来增大节点的面积(把移位工具放置在某个对象的边角就会变成变形光标)。也可以使用变形光标或者选择Remove Input来删除输入。

下图显示了利用流程图中的常数对象的值创建和初始化数组的两种方法。左侧的方法是,将5个字符串常数放入一个一维字符串数组中。右侧的方法是,将三组数值常数放入三个一维数值数组,再将这三个数组组成一个二维数组。这样最后产生的是一个3x3的数组,

三列分别是3, 4, 7; –1, 6, 2; 5, –2, 8.。

还可以通过结合其他的含有标量元素的数组来创建数组。例如,假设有两个数组,三个标量元素,可把它们组成一个新的数组,顺序是:数组1,标量1,标量2,数组2,标量3。

●初始化数组(Initialize Array)——用于创建所有元素值都相等的数组。下图

中,该功能函数创建了一个一维数组。

元素输入端子决定每个元素的数据类型和数值,维长度输入端子决定数组的长度,例如,假设元素类型是长整型,值为5,维长度为100,那么创建的数组是一个一维的、由100个值为5的长整型元素组成的数组。也可以从前面板控制端子、流程图常数或者程序其他部分的计算结果得到输入。

创建和初始化一个多维数组的方法是,用鼠标右键单击函数的右下侧,在弹出菜单中选择Add Dimension。还可以使用变形光标来增大初始化数组节点的面积,为每个增加的维添加一个维长度输入端子。也可以通过缩小节点的方法来删除维,即从函数的弹出菜单中选择Remove Dimension,或者使用变形光标。下面的示意图显示了怎样初始化一个三维数组。

如果所有的维长度输入都是0,该函数会创建一个具有指定数据类型和维数的空数组。

●数组大小——Array Size函数,返回输入数组中的元素个数。

●数组子集(Array Subset)——选取数组或者矩阵的某个部分。

该函数可以返回从某个指针开始的部分数组,并包括了长度元素。下图显示了一些数组子集的例子,注意,数组索引从0开始。

●索引数组(Index Array)——用于访问数组中的某个元素。

下图显示了一个索引函数的例子,它用于访问数组中的第三个元素。注意,因为第一个元素的索引为0,所以第三个元素的索引是2。

将一个二维数组与Index Array函数相连,Index Array就会含2个索引端子。将一个三维数组与Index Array函数相连,Index Array就会含3个索引端子。余类推。可以使用的索引端的符号是一个黑方快,被禁止使用的索引端(Disable Indexing)是一个空心的小方框。当给一个被禁止使用的索引端连接上一个Constant 或Control是它会自动变为黑方快,即变为可以索引,相反原来一个可以使用的索引端上连接的Constant 或Control被删去时,索引端符号会自动变为空心的小方框,即变为禁止使用。

也可以按照任何维的组合提取子数组,下面的示意图显示了怎样从一个二维数组中提取一个一维的行或者列数组。

还可以从一个三维数组中提取一个二维数组,方法是禁止两个索引端子,或者通过禁止一个索引端子提取一个一维数组。下图显示了从三维数组提取数组的各种方法。

下面的规则对使用剪切数组进行了规定:

输出对象的维数必须等于被禁止的索引端口的数目。例如

0个索引端口被禁止=标量元素

1个索引端口被禁止=二维元素

2个索引端口被禁止=三维元素

启动的端子所连接的数值必须指定输出元素。

这样,您就可以理解,上图中左下方的例子的作用是,利用0列和3行的所有元素产生一个一维数组,而右上方的例子的作用是利用第一帧中的所有元素产生一个二维数组。新的第0个元素是与原有元素最近的元素。

练习3-3使用创建数组功能函数

目的:使用创建数组函数,把一些元素和输出组织成一个更大的数组。

图3-8练习3-3的面板和框图

1.按照图3-8创建一个前面板。

2.从Controls?Numeric模板中选择一个数字控制对象放

置在前面板中,设置它的标签为scalar 1。

3.复制并粘贴该数字显示对象,创建两个新的对象,并分

别设置它们的标签为scalar 2和scalar 3。

4.创建一个数字控制对象的数组,设置它的标签为array

1。复制并粘贴它,创建一个新的数组,设置它的标签为array 2。

5.在array 1、scalar 1、 scalar 2、scalar 3、array

2中输入数值1到9。

6.创建流程图。选择Functions?Array,在流程图中放置

一个Build Array功能函数。用定位工具增大函数额面积,以容

纳5个输入。

7.把数组和标量与Build Array连接起来。创建输出的一

维数组,它由 array 1、scalar 1、 scalar 2、array 2、scalar

3中的元素所组成,如图所示。

8.执行该VI。可以看到array 1、scalar 1、 scalar 2、

scalar 3、array 2中的数值出现在同一个一维数组中。

9.保存该VI为LabVIEW\Activity目录下的Build

Array.vi。

练习3-3结束。

3.4什么是多态化(Polymorphism)?

多态化是指一种函数功能,即可以协调不同格式、维数或者

显示的输入数据。大多数LabVIEW的函数都是多态化的。例如,

图3-9给出了Add函数的一些多态化组合。

图3-9多态化组合的例子

第一个组合中,两个标量相加,结果还是一个标量。第二个

组合中,该标量与数组中的每个元素相加,结果是一个数组。数

组是数据的集合。第三个组合中,一个数组的每个元素被加到另

一个数组的对应元素中。您还可以使用其他的组合,例如数值簇

或者簇数组。

可以把这些准则应用到其他的G语言函数或者数据类型。G

语言函数对于各种情况都具有多态性功能。有些函数接受数值和

布尔输入,而有些函数接受其他任何数据格式的组合。如果您想

了解更多关于多态化的知识,请参阅Online

Reference?Function and VI Reference。

3.5簇

3.5.1创建簇控制和显示

在前面板上放置一个簇壳(Cluster shell)就创建了一个簇。

然后你可以将前面板上的任何对象放在簇中。例如数组,你也

可以直接从Control 工具板上直接拖取对象堆放到簇中。一个簇

中的对象必须全部是Control,或全是Indicator,不能在同一个

簇中组合Control与Indicator,因为簇本身的属性必须是其中之

一。一个簇将是Control或Indicator,取决于其内的第一个对象

的状态。如果需要可以使用工具重置簇的大小。右图所示是一

个含4个Control的簇。也可以在流程图上用类似的方法创建簇

常数。

如果你要求簇严格地符合簇内对象的大小,可在簇的边界上弹出快速菜单选择自动定义大小(Autosizing)

簇的序(Order)

簇的元素有一个序,它与簇内元素的位置无关。簇内第一个元素的序为0,第二个是1,等等。如果你删除了一个元素,序号将自动调整。如果你想将一个簇与另一个簇连接,这两个簇的序和类型必须同一。

如果想改变簇内元素的序,可在快速菜单中选择Claster Order ,这时会出现一个窗口,在该窗口内可以修改序。

3.5.2使用簇与子VI传递数据

一个VI的连接窗口最大有28个端子,如果你不希望使用全部28个端子传递数据,这既烦琐又易出错。通过把控制或显示对象捆绑成一个簇的方法,仅使用一个端子就可以实现该功能。

●捆绑(Bundle)数据

Bundle功能将分散的元件集合为一个新的簇,或允许你重置

一个已有的簇中的元素。可以用位置工具拖曳其图标的右下角以

增加输入端子的个数。最终簇的序是取决于被捆绑的输入的顺序。

右图中Bundle图标中部的Claster端子用于用新元素重置原簇中的元素。

●分解(Unbundle)簇

Unbundle功能是Bundle的逆过程,它将一个簇分解为若干分

离的元件。如果你要对一个簇分解,就必须知道它的元素的个数。

LabVIEW还提供一种可以根据元素的名字来捆绑或分解簇的方法,稍后介绍。

练习3-4簇

目的:学习创建簇、分解簇,再捆绑簇并且在另一个簇中显示其内容。

图3-10练习3-4的面板和框图

1.打开前面板,创建一个簇壳(Array & Cluster palette),标签改为Input Cluster,拖曳至适当大小。

2.在这个簇壳中放置一个数字Control,两个布尔开关,和一个串Control。

3.仿照以上步骤,创建Output Cluster如上。注意将各Control改为相应的indicator。4.用快速菜单查看两个簇的序是否一致,若有差别,改之。

5.在前面板上设置一个[STOP]按钮。注意其缺省值为FALSE,不要改变它的状态。6.建立如上面所示的流程图。注意在[STOP]按钮与循环条件端子之间接入了一个NOT函数,因为按钮缺省值为FALSE,经NOT函数后变为TRUE,这就意味着当按钮状态不变时,循环继续执行,相反一旦按钮动作,则循环终止。

7.返回前面板并运行VI。在输入簇中输入不同的值观察输出。

8.关闭并保存程序。Cluster Exercise.vi

练习3-4结束

3.5.3用名称捆绑与分解簇

有时你并不需要汇集或分解整个簇,而仅仅需要对其一、两个元素操作。这时你可以用名称来捆绑与分解簇。在Cluster 工具模板中除了Bundle及Unbundle功能外,还提供有Bundle By Name和Unbundle By Name功能。它们允许根据元素的名称(而不是其位置)来查询元素。与Bundle不同,使用Bundle By Name可以访问你需要的元素,但不能创建新簇;

它只能重置一个已经存在的簇的元素,同时你必须给Bundle By Name 图标中间的输入端子一个输入以申明要替换其元素的簇。Unbundle 可返回指定名称的簇元素,不必考虑簇的序和大小。例如,如果你想重置上例中Boolean 2的值,就可以使用Bundle By Name 功能而不必担心簇的序和大小。与此类似如果你要访问串的值,可以使用Unbundle By Name 功能。

图3-11 用名称操作簇

在上面的例子中,Cluster Control 中有两个元素,一个是数据类型(名称是

Numeric )

,另一个是字符串型(名称是String ),另一个控制是字符串“ABCD ”,框图如右所示,运行该程序,即可将簇内的字符串值重置。

3.5.4 数组和簇的互换

有时你会发现,将数组变为簇(或者相反)很方便。尤其是因为LabVIEW 包括的关于数组的操作功能多于簇。例如,前面板上有一个多按钮的簇,你希望颠倒这些按钮值的序。好了,Reverse 1D Array 功能正好可用,但是它仅可用于数组。这没关系,你可以使用功能Cluster to Array 将簇转换为数组,使用Reverse 1D Array 切换开关的值,最后再利用Array to Claster 变换回簇。

3.6 Waveform 数据类型

在数据采集和信号分析中经常要遇到波形数据,在LabVIEW 6i 中增加了Waveform 数据类型,使得波形的描述更加简洁。Waveform 数据类型包含了波形的数据(Y)、起始时刻(t0)和步长ΔX ,使用Waveform 模板的Build Waveform 函数可以建立一个波形。许多用于数据采集和波形分析的VI 和函数的缺省状态都接受或返回Waveform 数据类型。当你将一个Waveform 数据类型连接到Waveform Graph 或Chart 时,会自动画出相应的曲线。Waveform 数据类型是根据原有的数据类型进一步“打包”组合而成,这种打包也不可避免地带来一些负作用,有时还需要对Waveform 数据类型“解包”。有关这一数据类型的函数或VI 在 Functions? Waveform 和Analyze 之中。

(完整word版)LabVIEW编程基础(中)

LabVIEW的基本控件与基本函数 LabVIEW基本控件:数值、布尔、字符串与路径、数组与簇、图形、枚举1、数值:数值输入控件与数值显示控件(数值输入控件有增量/减量按钮;输入为白色背 景,输出为灰色背景) 默认数据类型为:双精度,橙色。 2、布尔:值默认为False,图标为绿色。 布尔控件的机械动作属性 单击时转换:按下按钮时改变状态,再次单击后恢复原状态。与VI是否读取控件无关。(可赋值恢复)类似开关按钮 释放时转换:按下按钮时保持当前状态,直到释放按钮,再次单击后恢复原状态。与VI是否读取控件无关。(可赋值恢复)类似开关按钮 保持转换直到释放:按下按钮时改变状态,直到释放按钮,,再次单击后恢复原状态。与VI 是否读取控件无关。(可赋值恢复)。类似开关按钮 单击时触发:按下按钮时改变状态,LabVIEW再次读取控件值后返回原状态。 释放时触发::按下按钮时保持当前状态,释放时改变状态,LabVIEW再次读取控件值后返回原状态。 保持触发直到释放:按下按钮时改变状态,直到释放按钮,LabVIEW再次读取控件值后返回原状态。

3、字符串与路径:(字符串输入控件与字符串显示控件),粉色。 4种显示方式(正常显示、’\’代码显示、密码显示、十六进制显示) 4、数组:依据加入的控件类型同样分为输入控件与显示控件 LabVIEW的数组以索引号0表示数组的首个数据。 增加数组维度的方法:(1)索引框的快捷菜单中->增加维度 (2)直接向下拖动索引框 (3)属性对话框->外观选项卡->维 数组中的元素为同类型的控件,可以是各种类型的控件,但不能是数组的数组。数组的多态性: 5、簇:依据加入的控件类型同样分为输入控件与显示控件 簇本身的属性:重新排序簇中控件、自动调整大小(无、调整为匹配大小、水平排列、垂直排列) 使用簇结构时,尽可能的使用:严格自定义类型。 错误簇:状态(布尔)、代码(数值输入)、源(字符串输入)

图像轮廓线提取

数学实验报告 实验二图像轮廓线提取技术 学院 专业 姓名 学号 成绩单序号 提交日期

一、实验目的 1.了解对matlab的图像处理功能,掌握基本的图像处理方式; 2.掌握imread,imshow,imwrite,subplot,title等的基本使用方法。 3.掌握图像轮廓线提取的简单方法并上机实现。 4.了解matlab自带的边界检测算子的使用,提高对复杂图像处理的能力。 二、实验要求 1.任意选取一幅灰度图像和一幅彩色图像,对算法中若干关键语句中进行调整,得出不同的实验结果,对这些结果进行分析,并与MATLAB自带的边缘检测做对比。 2.提出其它的轮廓线提取方法,与简单阈值法进行比较分析。 三、实验过程 1.任意选取一幅灰度图像和一幅彩色图像,对算法中若干关键语句中进行调整,得出不同的实验结果,对这些结果进行分析。 ⑴灰度图的轮廓线提取,M文件代码: function gray(pix,n) %灰度图的轮廓线提取 A=imread(pix); %读取指定的灰度图%生成与图像对应的矩阵 [a,b]=size(A); %a,b分别等于矩阵A的行数和列数 B=double(A); %将矩阵A变为双精度矩阵 D=40*sin(1/255*B); %将矩阵B进行非线性变换 T=A; %新建与A同等大小矩阵 for p=2:a-1 %处理图片边框内的像素点 for q=2:b-1 if (D(p,q)-D(p,q+1))>n|(D(p,q)-D(p,q-1))>n|(D(p,q)-D(p+1,q))>n|(D(p,q)-D(p-1,q))>n|( D(p,q)-D(p-1,q+1))>n|(D(p,q)-D(p+1,q-1))>n|(D(p,q)-D(p-1,q-1))>n|(D(p,q)-D(p+1,q +1))>n T(p,q)=0; %置边界点为黑色%新建轮廓线矩阵 else T(p,q)=255; %置非边界点为白色 end; end; end; subplot(2,1,1); %将窗口分割为两行一列,下图显示于第一行 image(A); %显示原图像 title('灰度图原图'); %图释 axis image; %保持图片显示比例 subplot(2,1,2); %下图显示于第二行 image(T); %显示提取轮廓线后的图片

CCD图像的轮廓特征点提取算法

第33卷第4期电子科技大学学报V ol.33 No.4 2004年8月Journal of UEST of China Aug. 2004 CCD图像的轮廓特征点提取算法 侯学智,杨平,赵云松 (电子科技大学机械电子工程学院成都 610054) 采用最大方差法将图像二值化,用图像形态学的梯度细化和修剪算法来提取边缘轮廓,利用十一【摘要】﹑ 点曲率法得到轮廓的角点和切点的大致位置。提出了一种基于最小二乘拟合的改进算法,来进一步确定角点和切点,并对轮廓分段识别。该算法应用在基于图像处理的刀具测量系统中,实际结果表明具有良好的抗噪声性能,能准确提取出图像的特征点。 关键词刀具测量; 细化; 曲率; 最小二乘拟合; 角点 中图分类号TP391 文献标识码 A Contour Feature Point Detection Algorithm of CCD Image Hou Xuezhi,Yang Ping,Zhao Yunsong (School of Mechatronic Engineering, UEST of China Chengdu 610054) Abstract The image is segmented to Bi-value image with max variance algorithm, and then the edge is detected by a series of image morphology algorithm including grads, thinning and cutting. The eleven point curvature-computing method is used to locate the area of corner and point of tangency. An improved algorithm based on least square fitting is given to search corner and point of tangency. This algorithm is applied to the cutting tools measurement system based on image processing and the actual result proves it has a good noise-resisted performance and can detect feature points accurately. Key words cutting tools measurement; thinning; curvature; least square fitting; corner 目前数控加工精度已达到微米级,对刀精度要求愈来愈高。传统的刀具测量方式采用人眼瞄准,容易带来主观误差,使对刀精度降低。在基于图像处理的刀具测量系统中,CCD数码相机将对刀状态的图像摄入,通过USB接口输入计算机。首先提取出刀具轮廓的特征点,再对轮廓曲线进行分段,从而测量刀具的长度﹑半径﹑角度等参数。通常利用曲率信息来提取轮廓特征点,三点曲率法对噪声较敏感,十一点曲率法能较好地估算出轮廓的曲率,并能简单提取出轮廓的角点与切点区域[1, 2]。本文提出利用最小二乘法拟合角点和切点区域的曲线,根据计算的斜率和曲率的特点能有效确定角点和切点。 1 图像预处理 被测刀具的图像如图1所示。CCD相机采集到刀具的彩色图像,将其转化为256色的灰度图像,如图1a 所示,采用最大方差阈值法将图像二值化。由于刀具表面存在油污,光线散射等原因,图像二值化后,在刀具部分有颗粒状噪声,而刀具以外有细小孔洞存在,所以在提取轮廓前,采用形态学算子滤波。在图像形态学中,最基本的运算是腐蚀和膨胀运算,通过腐蚀和膨胀可以构成开运算与闭运算。开闭运算都能够平滑边缘,其中开运算能够消除细小物体,闭运算能够填充物体孔洞。本文采用方形结构元素,对图像先闭运算后开运算,有效地滤除了图像的细小孔洞和噪声,而刀具的结构和面积基本保持不变。图1b所示为 收稿日期:2003 ? 07 ? 24 作者简介:侯学智(1980 ? ),男,硕士生,主要从事工业测控技术方面的研究.

LabVIEW中的数组操作函数

L a b V I E W中的数组操作 函数 Company Document number:WTUT-WT88Y-W8BBGB-BWYTT-19998

LabVIEW中的数组操作函数 现在我们已经了解了中的的一些基本概念(包括了前面这几篇文章、、)。在这篇文章里面我们接着讨论一下如何操作数组了。在的Functions(函数)工具框的Programming>>Array子工具框中有很多操作数组的函数。(我们在使用数组的时候要记住中的数组元素的索引是从0开始的,也就是说它的第一个元素的索引为0,第二个元素的索引为1,以此类推。)我们将在这里讲解常用的数组操作函数,LabVIEW中数组函数的工具框如下图所示: ?初始化数组函数将创建并按照你设定的值来初始化N维数组。通过将光标置于该函数最下方边框,出现拖动光标后向下拖动就可以为该数组增加维数。该函数适用于为已知大小的数组分配内存或者是初始化数组类型数据的。 该函数如下图所示: ?数组大小函数会返回输入数组的元素的个数。如果输入的数组为N维的多维数组,该函数就会返回有N个元素的一维数组,每个元素按顺序对应每维的元素的个数。该函数如下图所示: ? ?创建数组函数(BuildArray)可以根据你的设置来将两个数组连接或合成为一个数组以及为现有数组添加新的元素。当第一次将该函数放到LabVIEW的框图中的时候,该函数可能像下图左侧所示是个非常简单的图标。你可以通过拖动该函数下边框的图标或者是通过在该函数上点击右键从右键菜单中选择AddInput来为该函数增加输入参数的个数,如下图右侧所示。该函数可以有两种类型的输入:数组以及数组元素,该函数可以从数组以及单值的输入来组装一个新的数组。 ? 创建数组函数的输入会根据你连接到输入端点的数据类型自动调整为元素类型或数组类型的输入。在更高级的应用中,该函数还可以创建多维数组或者是为多维数组增加新的数组元素。为多维数组增加元素时,该元素必须是比要增加的数组小一维的数组。例如,为二维数组添加的新元素必须是一个一维数组。也可以将多个一维数组作为元素连接到这个函数的输入端点上来创建一个新的二维数组,每个一维数组就成为这个二维数组的一行。如果你只是将这些一维数组接续为一个新的一维数组的话,就需要在该函数上点击鼠标右键并从右键菜单中选择ConcatenateInputs选项。?子数组函数会按照该函数输入的起始索引以及长度返回输入数组的一部分。该函数如下图所示: ? 在使用这个函数的时候一定要记住LabVIEW中数组的索引是从0开始的,第一个数组元素的索引是0,而不是1。?获取数组元素函数(IndexArray)可以用来访问数组中的某个特定元素。该函数如下图所示。 ? 对于一维数组来说,只要输入要访问的元素的索引就可以在对应的输出得到该元素的值;不过对于二维数组来说,通过输入特定元素的行号、列号就可以访问到该元素的值,如果你想获得某行或某列的全部值,那么在输入端只输入行号或列号即可。 ?删除部分数组函数(DeleteFromArray)可以删除数组中从某一索引号开始某设定长度的部分并返回删除该部分后的数组以及被删除的部分数组。该函数如下图所示:

LabVIEW教程第四章图形显示

第四章图形显示 4.1概述 图形显示对于虚拟仪器面板设计是一个重要的内容。LabVIEW为此提供了丰富的功能。在前面几章我们已经接触了这个问题,现在较系统地介绍一下。 我们不从图形的实现方法上去讨论问题,那是计算机图形学的课题。但我们需要从用户的可能的需求角度探求一下,如果你需要做虚拟仪器方面的开发,那么可能遇到些什么图形问题。LabVIEW在这方面所做的工作是非常值得借鉴的。 在LabVIEW的图形显示功能中Graph和Chart是两个基本的概念。一般说来Chart是将数据源(例如采集得到的数据)在某一坐标系中,实时、逐点地显示出来,它可以反映被测物理量的变化趋势,例如显示一个实时变化的波形或曲线,传统的模拟示波器、波形记录仪就是这样。而Graph则是对已采集数据进行事后处理的结果。它先将被采集数据存放在一个数组之中,然后根据需要组织成所需的图形显示出来。它的缺点是没有实时显示,但是它的表现形式要丰富得多。例如采集了一个波形后,经处理可以显示出其频谱图。现在,数字示波器也可以具备类似Graph的显示功能。 LabVIEW 方式表现形式要远为丰富,但这是以牺牲实时为代价的。在LabVIEW 6i版本中还包含有极坐标等其他图形(Plot),本章不讨论。 4.2Graph控件 各种图形都提供了相应的控件,以Graph为例介绍。图4-1所示为它的控件。所有这些控件都包含在图形快速菜单的Visible Items选项下。 曲线图例可用来设置曲线的各种属性,包括线型(实线、虚线、点划线等)、线粗细、颜色以及数据点的形状等。 图形模板可用来对曲线进行操作,包括移动、对感兴趣的区域放大和缩小等。 光标图例可用来设置光标、移动光标,帮助你用光标直接从曲线上读取感兴趣的数据。 刻度图例用来设置坐标刻度的数据格式、类型(普通坐标或对数坐标),坐标轴名称以及刻度栅格的颜色等。

labview实验报告

LabVIEW课程设计 报告书 班级 学号 姓名 一、基础题

1、用labview的基本运算函数编写以下算式的程序代码: 首先在前面板创建一个数值输出控件,然后在程序框图中按照上图连接线路,点击运行,程序结果。 2、利用摄氏温度与华氏温度的关系C = 5(F ?32) / 9编写一个程序,求华氏温度 (F)为32, 64, 4, 98.6 , 104, 212时的摄氏温度。

在程序前面板创建一个数值输入控件和一个数值显示控件,在程序框图中添加一个公式节点,添加一个输出和一个输入分别输入和显示控件项链,在公式节点框图中输入温度转换公式,然后在面前扮输入相应的温度点击运行,得到相应的结果。 3、创建一个2行3列的二维数组控制件,为数组成员赋值如下: 00 .600.500.400.300.200.1 在前面板创建一个数组显示控件,然后将1、2、3创建成数组第一行,4、5、6创建成数组第二行,再将两行创建成一个两行三列的二位数组,点击运行显示输 出结果。 4、用数组创建函数创建一个二维数组显示件,成员为:

1 2 3 4 5 6 2 3 4 5 6 1 3 4 5 6 1 2 4 5 6 1 2 3 编程将上述创建的数组转置为: 1 2 3 4 2 3 4 5 3 4 5 6 4 5 6 1 5 6 1 2 6 1 2 3 先在面前板上创建一个上图这样的数组。再创建两个显示数组(一个为显示数组,另一个为转换后数组),在程序框图上面按照下图连线,在原数组和转换后数组之间接一个“二维数组转制”, 点击运行后显示为:

5、创建一个簇控制件,成员分别为字符型控制件姓名,数值型控制件学号,布 尔型控制件注册。从这个簇控制件中提取出簇成员注册,显示在前面板上。 在面板上添加一个簇,在族里分别添加一字符显示控件,数值显示控件,布尔型 显示控件,程序框图连接如图: 先解除捆绑然后再捆绑,输入姓名、学号点击运行在输出簇里显示。 6、创建一个字符串显示件,程序运行后显示当前系统日期、时间和自己的班级、姓名。

labview读取txt文档,按列取数组,画图

要读取的txt文档为两列,第一列为x坐标,第二列为y坐标,两列之间用制表符隔开,格式如下: -4.000000E+1 8.583130E-6 -3.990000E+1 9.536800E-6 -3.980000E+1 1.001360E-5 -3.970000E+1 1.049050E-5 -3.960000E+1 1.001360E-5 -3.950000E+1 1.096730E-5 -3.940000E+1 1.096730E-5 -3.930000E+1 1.096730E-5 -3.920000E+1 1.096730E-5 -3.910000E+1 1.192100E-5 -3.900000E+1 1.192100E-5 -3.890000E+1 1.096730E-5 -3.880000E+1 1.192100E-5 -3.870000E+1 1.192100E-5 -3.860000E+1 1.192100E-5 -3.850000E+1 1.192100E-5 -3.840000E+1 1.239780E-5 -3.830000E+1 1.192100E-5 -3.820000E+1 1.239780E-5 -3.810000E+1 1.192100E-5 -3.800000E+1 1.239780E-5 -3.790000E+1 1.192100E-5 -3.780000E+1 1.192100E-5 -3.770000E+1 1.144420E-5 -3.760000E+1 1.192100E-5 -3.750000E+1 1.096730E-5 -3.740000E+1 1.192100E-5 -3.730000E+1 1.096730E-5 -3.720000E+1 1.144420E-5 -3.710000E+1 1.096730E-5 -3.700000E+1 1.096730E-5 -3.690000E+1 1.096730E-5 -3.680000E+1 1.096730E-5 读取坐标数据后画图,效果如下: 1.读取直接使用函数:文件I/0——》读取电子表格文件

lABVIEW关于数据类型的编辑:数组、簇和波形

数据类型:数组、簇和波形 .1概述 数组是同类型元素的集合。一个数组可以是一维或者多维,如果必要,每维最多可有231-1个元素。可以通过数组索引访问其中的每个元素。索引的范围是0到n – 1,其中n是数组中元素的个数。图3-1所显示的是由数值构成的一维数组。注意第一个元素的索引号为0,第二个是1,依此类推。数组的元素可以是数据、字符串等,但所有元素的数据类型必须一致。 图3-1数组示意图 簇(Cluster)是另一种数据类型,它的元素可以是不同类 型的数据。它类似于C语言中的stuct。使用簇可以把分布在流 程图中各个位置的数据元素组合起来,这样可以减少连线的拥挤 程度。减少子VI的连接端子的数量。 波形(Waveform)可以理解为一种簇的变形,它不能算是一种有普遍意义的数据类型,但非常实用。 3.2数组的创建及自动索引 3.2.1创建数组 一般说来,创建一个数组有两件事要做,首先要建一个数组的“壳”(shell),然后在这个壳中置入数组元素(如果需要用一个数组作为程序的数据源,可以选择Functions?Array?Array Constant,将它放置在流程图中。然后再在数组框中放置数值常量、布尔数还是字符串常量。下图显示了在数组框放入字符串常量数组的例子。左边是一个数组壳,中间的图上已经置入了字符串元素,右边的图反映了数组的第0个元素为:”ABC”,后两个元素均为空。 图3-1数组的创建 在前面板中创建数组的方法是,从Controls模板中选择 Array & Cluster,把数组放置在前面板中,然后选择一个对象 (例如数值常量)插入到数组框中。这样就创建了一个数值数组。 也可以直接在前面板中创建数组和相应的控制对象,然它们

Labview数组

创建多维数组首先要在一维数组基础上修改维数。修改数组维数通常有以下几种方法。 (1)改变索引框大小来增减维数。将光标移至索引号四周,出现改变大小的箭头,单击鼠标拖动箭头改变索引号框的大小和索引号的个数。索引号的个数就代表数组的维数,如图1所示为拖出了两个索引号,成为二维数组,然后再改变元素区域大小以显示出二维数组。 图1 改变索引号大小以创建二维数组 (2)通过索引号的右键快捷菜单选项“添加维度”来增加数组的维数,通过选项“删除维度”来减少数组的维数,如图2所示。 (3)选择数组的右键快捷菜单选项“属性”,在弹出的属性对话框中改变数组的维数,如图3所示,在对话框“外观〃选项卡左下方的“维”数字框中即可设置维数。

图2 通过索引号的右键快捷菜单选项增减维数

图3 数组属性对话框 在前面板窗口中,可以创建上述输入控件数组,也可以创建显示控件数组。在添加元素时选择添加显示控件即可创建显示控件数组。 在程序框图窗口中可以创建数组常量。在程序框图函数选板中选择“编程-数组→数组常量”置于程序框图窗口中,出现如图4所示数组常量框架。数组常量框架类似于前面板数组框架,包括索引号和元素区域。 创建数组常量的过程与创建输入控件数组类似,设置显示的元素和增减维数的方法也相同。首先在数组常量框架中然后设置数组元素,操作过程如图5 所示。

图4 数组常量框架 图5创建数值型数组常量 首先要说明一下,LabVIEW中其实并没有明确的赋值的概念,他和传统的文本编程语言的思路不一样,是数据流驱动的编程。在一般的文本编程语言里,定义二维数组变量的时候只是开辟了一块内存空间,里面是空的,所以要有赋值的过程;而LabVIEW中内存不需要手动分配,其后台有自动管理内存的机制,出现新的二维数组的时候,不需要变量定义,直接分配内存空间,然后就把数据存进去了。如果硬要说有什么“赋值”的概念的话,LabVIEW中倒是有几种常见的类似于“赋值”的操作。 1.在二维数组控件的前面板里直接填入数值 这个最简单,不用多说想必你也明白,手动填数。 2.创建单一元素的数组 需要用到初始化数组,见下图

labview数组、簇和图形的区别

数组是同类型元素的集合。一个数组可以是一维或者多维, 如果必要,每维最多可有231-1个元素。可以通过数组索引访问 其中的每个元素。索引的范围是0到n – 1,其中n是数组中 元素的个数。图3-1所显示的是由数值构成的一维数组。注意 第一个元素的索引号为0,第二个是1,依此类推。数组的元素 可以是数据、字符串等,但所有元素的数据类型必须一致。 图3-1数组示意图 簇(Cluster)是另一种数据类型,它的元素可以是不同类 型的数据。它类似于C语言中的stuct。使用簇可以把分布在流 程图中各个位置的数据元素组合起来,这样可以减少连线的拥挤 程度。减少子VI的连接端子的数量。 波形(Waveform)可以理解为一种簇的变形,它不能算是一种有普遍意义的数据类型,但非常实用。 3.2数组的创建及自动索引 3.2.1创建数组 一般说来,创建一个数组有两件事要做,首先要建一个数组的“壳”(shell),然后在这个壳中置入数组元素(数或字符串等)。 如果需要用一个数组作为程序的数据源,可以选择 Functions?Array?Array Constant,将它放置在流程图中。然后 再在数组框中放置数值常量、布尔数还是字符串常量。下图显示 了在数组框放入字符串常量数组的例子。左边是一个数组壳,中 间的图上已经置入了字符串元素,右边的图反映了数组的第0个 元素为:”ABC”,后两个元素均为空。 图3-1数组的创建 在前面板中创建数组的方法是,从Controls模板中选择 Array & Cluster,把数组放置在前面板中,然后选择一个对象 (例如数值常量)插入到数组框中。这样就创建了一个数值数组。 也可以直接在前面板中创建数组和相应的控制对象,然后将

图像轮廓提取

OpenCV笔记9:提取并显示图像轮廓 01#include 02#include 03#include 04#include 05void main() 06{ 07int i=0; 08int mode=CV_RETR_CCOMP; //提取轮廓的模式 09int contoursNum=0; //提取轮廓的数目 10CvScalar externalColor; 11CvScalar holeColor; 12CvMemStorage*storage=cvCreateMemStorage(0); //提取轮廓需要的储存容量0为默认64KB 13CvSeq*pcontour=0; //提取轮廓的序列指针 14IplImage*pImg=NULL; 15IplImage*pContourImg=NULL; 16IplImage*src=cvLoadImage("pic3.png",-1); 17pImg=cvCreateImage(cvGetSize(src),src->depth,1); 18pContourImg=cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,3); 19cvCvtColor(src,pImg,CV_RGB2GRAY); //将图像转换为灰度 20cvNamedWindow("src",CV_WINDOW_AUTOSIZE); 21cvNamedWindow("pcontour",CV_WINDOW_AUTOSIZE); 22cvShowImage("src",src); 23cvThreshold(pImg,pImg,180,255,CV_THRESH_BINARY); //二值化 24//--------------查找轮廓---------------- 25mode=CV_RETR_LIST; 26 contoursNum=cvFindContours(pImg,storage,&pcontour,sizeof(CvContour),mode,CV_CHAIN_APPRO X_NONE); 27cout<h_next) 30{ 31holeColor=CV_RGB(rand()&255,rand()&255,rand()&255); 32externalColor=CV_RGB(rand()&255,rand()&255,rand()&255); 33cvDrawContours(pContourImg,pcontour,externalColor,holeColor,1,2,8); 34} 35cvShowImage("pcontour",pContourImg); 36cvWaitKey(0); 37cvReleaseImage(&src); 38cvReleaseImage(&pImg); 39cvReleaseImage(&pContourImg); 40}

一种医学图像的轮廓提取方法

—218 — ·图形图 36卷 第5期 ol.36 No.5 2010年3月 March 2010 像处理· 文章编号:1000—3428(2010)05—0218—03 文献标识码:A 中图分类号:TP391 一种医学图像的轮廓提取方法 罗三定,王建军 (中南大学信息科学与工程学院,长沙 410083) 摘 要:针对医学图像的模糊性和灰度不均导致目标轮廓难以准确提取的问题,提出使用改进的遗传算法控制主动轮廓模型完成边界提取的方法。采用保优算子保留遗传性状,选择适当的交叉算子,在进化后期可实现由整体寻优到局部寻优的转变。实验结果证明,该方法在提取目标轮廓时抗模糊能力强、鲁棒性好。 关键词:主动轮廓模型;轮廓提取;改进的遗传算法 Contour Extraction Method for Medical Images LUO San-ding, WANG Jian-jun (School of Information Science and Engineering, Central South University, Changsha 410083) 【Abstract 】Medical images with fuzzy and non-uniform characteristics make it difficult to accurately extract target contour, aiming at this problem, this paper adopts an improved genetic algorithm to make active contour model finish boundary extraction. It adopts prepotent operator to keep inheritance of quantitative characteristic and select proper crossover operator. In the anaphase stage of the improved genetic algorithm, it solves its changeover from global optimization to local optimization. Experimental results show that it is anti-fuzzy with good robustness in extracting contour of targets. 【Key words 】active contour model; contour extraction; improved genetic algorithm 计 算 机 工 程 Computer Engineering 第V 1 概述 医学图像由于其成像方式及特定环境的原因,具有模糊和不均匀的特点,主要体现为在同一组织中密度值和均匀度出现大幅度的变化。医学图像的几何性状较为模糊,在感兴趣区域的边界位置、拐角以及凸出点难以精确描述,边缘无法明确确定,这在很大程度上影响了图像的分割。在计算机视觉系统中,医学图像分割的方法主要分为阈值分割方法、区域生长法、结合特定理论工具的方法和基于主动轮廓模型的方法。 阈值分割法是处理分离目标与背景的最常见的图像处理方法,采用单一的全局阈值难以正确完成感兴趣区域的分割。基于直方图法的全局阈值分割是图像分割[1]的常用方法,直方图反映了图像全局的灰度分布,在目标和背景的灰度有明显差别时效果较好。局部阈值分割法是在局部范围内求取各子块的最佳阈值,经典OTSU 法的阈值求取计算量较大,不能很好地处理部分灰度均匀的区域,且区域划分大小难以 确定。 文献[2]的区域生长法根据预定义的标准,提取图像中相互连通的区域。该方法一般应用于序列图像处理过程,描绘面积小且拓扑结构简单的区域,但在提取每个区域的过程中,必须人工相应给出一个种子点。这种方法对噪声很敏感,可能会产生孔状或不连续的区域;局部影响较大的地方也可能会使原本应该连通的区域分离开来。 结合特定理论工具的分割方法有模式识别、模糊技术等。模式识别虽有较高的效率,但需要人工交互的方式获得训练数据,对大量的图像数据使用相同的训练样本而没有考虑不同的物理特性可能导致结果不准确。模糊技术的方法不考虑空间建模,对噪声和非同质的灰度很敏感[3]。 基于主动轮廓模型的方法[4]的特点是将图像数据、初始轮廓、收敛轮廓和基于先验知识的约束条件统一于特征提取的过程中。 本文对医学图像的特征进行研究分析后,采用改进的遗传算法作为外部约束力,控制曲线在能量最小化的作用下收敛,直至提取目标边缘。 2 Snake 模型 主动轮廓模型又称为Snake 模型,主要思想是定义一条初始能量函数曲线,将其初始化在待分割轮廓周围,在能量函数的极小值条件约束下,经过不断地演化曲线,最终收敛到图像轮廓[4-5]。 Snake 模型定义为 [][]()(),(); 0,1v s x s y s s =∈ (1) 它由一组控制点组成,这些点首尾相连构成轮廓线。其中()x s 和表示每个控制点在图像中的坐标位置,()y s s 是以傅里叶变换形式描述边界的自变量。 在控制点上定义的能量函数为 2221 image total 20()()()()(())d E s v s s v s E v s s s αβs ?????? =+ +∫???????? (2)

Labview 第三章 数据类型:数组、簇和波形

第三章数据类型:数组、簇和波形 3.1概述 数组是同类型元素的集合。一个数组可以是一维或者多维, 如果必要,每维最多可有231-1个元素。可以通过数组索引访 问其中的每个元素。索引的范围是0到n –1,其中n是数组 中元素的个数。图3-1所显示的是由数值构成的一维数组。注 意第一个元素的索引号为0,第二个是1,依此类推。数组的元 素可以是数据、字符串等,但所有元素的数据类型必须一致。 图3-1数组示意图 簇(Cluster)是另一种数据类型,它的元素可以是不同类 型的数据。它类似于C语言中的stuct。使用簇可以把分布在流 程图中各个位置的数据元素组合起来,这样可以减少连线的拥挤 程度。减少子VI的连接端子的数量。 波形(Waveform)可以理解为一种簇的变形,它不能算是一种有普遍意义的数据类型,但非常实用。 3.2数组的创建及自动索引 3.2.1创建数组 一般说来,创建一个数组有两件事要做,首先要建一个数组的“壳”(shell),然后在这个壳中置入数组元素(数或字符串等)。 如果需要用一个数组作为程序的数据源,可以选择 Functions?Array?Array Constant,将它放置在流程图中。 然后再在数组框中放置数值常量、布尔数还是字符串常量。下图 显示了在数组框放入字符串常量数组的例子。左边是一个数组 壳,中间的图上已经置入了字符串元素,右边的图反映了数组的 第0个元素为:”ABC”,后两个元素均为空。 图3-1数组的创建

在前面板中创建数组的方法是,从Controls模板中选择 Array & Cluster,把数组放置在前面板中,然后选择一个对象 (例如数值常量)插入到数组框中。这样就创建了一个数值数组。 也可以直接在前面板中创建数组和相应的控制对象,然后将 它们复制或者拖曳到流程图中,创建对应的常数。 还有很多在流程图中创建和初始化数组的方法,有些功能函 数也可以生成数组。 3.2.2数组控制对象、常数对象和显示对象 通过把数组与数值、布尔数、字符串或者簇组合在一起,可以在前面板和流程图中创建任何一种控制对象、常数对象和显示对象。数组元素不能是数组、图表或者图形。如果您想查看一些数组的例子,请查看Examples\General\arrays.llb中的例子。 3.2.3自动索引 For循环和While循环可以自动地在数组的上下限范围内编索引和进行累计。这些功能称为自动索引。在启动自动索引功能以后,当把某个外部节点的任何一维元素连接到循环边框的某个输入通道时,该数组的各个元素就将按顺序一个一个地输入到循环中。循环会对一维数组中的标量元素,或者二维数组中的一维数组等编制索引。在输出通道也要执行同样的工作――数组元素按顺序进入一维数组,一维数组进入二维数组,依此类推。 在默认情况下,对于每个连接到For循环的数组都会执行 自动索引功能。可以禁止这个功能的执行,方法是用鼠标右键单 击通道(输入数组进入循环的位置),在快捷菜单中选择Disable Indexing。 练习3-1创建一个自动索引的数组 目的:使用For 循环的自动索引功能创建数组,并用一个图形(Graph)显示该数组。 前面板 图3-2练习3-1的面板 1.打开一个新的前面板。 2.选择Controls?Array & Cluster,在前面 板中放置一个数组。设置它的标签为Waveform Array。

图像轮廓的提取和中心点的生成

4.2.1 图像轮廓的提取和中心点的生成 4.3 标定实验 普通的摄像机标定方式全部需要使用标定参照物,也就是在标定时期在摄像机前放置已知形状和尺寸的物体。 4.3.1 选取标定参照物 普遍使用具有圆形特点的、棋盘与立方体标定物等[19-24],本文主要使用标定参照物当做圆形特征的平面模板,参考图 4.2 内容,最初是由JanneHeikkil? 指出的全新标定方式,上述模板将圆孔中心当做标定参照点,和一般参照物对比来说,优势是制作便利,圆孔中心坐标对图像处理中的阈值化操作不敏锐,几何意义清楚,不需要特征对照,精准度高等。 4.3.2 选取工件坐标系 在测试的时候,最先要选择工件坐标系来叙述工件位姿数据。选择方式为: 确定标定板的两条中心对称线,会贯穿中心线所通过的众多圆的圆心,此外上述中心线的重叠点就是中心圆的圆心。之后把标定板放置在工作台上,调节摄像机的视场中,在视觉软件中开启视频图像窗口的图像坐标系显示线,调节标定板两条中心线和视频窗口内的图像坐标系显示线中心重叠,参考图4.3 内容。 图4.3 标定板中心线和图像坐标系坐标轴线重叠 在上述环节中,主要在机器视觉控制界面内的窗口观察进行相关调节。两条中心线重叠之后,确定标定板不会变化,此刻标定板的中心,换句话说就是确定的工件坐标系圆点,Z 轴垂直在标定板平面方向上,X 轴与Y 轴通过上述两条中心线。其正方向的选择标准是尽可能缩小工件坐标系和机器人基坐标系两轴正方向的夹角。 如此选择工件坐标系的优势是图像坐标系和工件坐标系的XOY 面在图像内的投影重叠,如此就可以省略运算环节,缩小结果误差。 4.3.3 计算摄像机的外参数dx 和dy 确定标定参照物和工件坐标系以后,要对摄像机筹集图像的全部像素对照在工件坐标系下XOY 面的物理尺寸dx和dy 进行计算。依照标定板得知每相邻两圆的圆心距离是38cm,X 轴、Y 轴所处直线上能选择距离最长的两圆距离和像素值当做参考,如此就可以缩小误差。通过计算我们就可以了解到: X轴所处直线上最远两圆的距离值Lx 为:6×38mm; Y轴所处直线上最远两圆的距离值Ly 为4×38mm在图像坐标系中 X轴所处直线上最远两圆的像素数Nx 为:938; Y轴所处直线上最远两圆的像素数N y 为:626; 了解上述所有量以后,就能得出图像的像素对照在工件坐标系下XOY 面的物理信息Lx 0.243mm Ly 际坐标系内: 最先在工件坐标系的XOY 面上挑选大量特定点,本次重点选择的特定点是通过多个轴线的11 个圆之圆心。挑选X 轴和Y 轴的点当做特定点的优势为,计算便利且结果精准。此后使用操作机器人明确基坐标系下的位置。由于机器人手爪中心点和特定点不能全部对齐,所以才有直径与标定板上圆直径相同的圆柱体当做中间者,方便查找。未来对所有确定的点进行多次定位,进而避免误差。本文标定实验内选择的圆柱体高是80mm,直径20mm。才有机器人对全部选定点反复定位五次取平均值。此处值得关注的是,定位点并非是工件坐标系XOY 面的点,主要是圆柱体圆心,此外在多次开展定位时,尽可能让两者位于相同平面再根据实验顺序依次对应标定板上的标定圆,且进行编号排列(参考图4.4 内容),得出的信息 参考图内容:

labview数组排序算法

18.2.2 冒泡排序 “冒泡”是什么意思?湖底有时会冒出一个气泡,气泡刚在湖底时,是很小的,在向上浮的过程中,才一点地慢慢变大。学过高中的物理的人,应该不难解释这一现象。冒泡排序的过程有点类似这个过程,每前进一步,值就大一点。 排序当然有两个方向,一种是从小排到大,一种是从大排到小。大多数教科书里都讲第一种,我们也如此。这样一来,冒泡排序法就改为“沉泡法”了,较大值一点点跑到数组中的末尾。 一般教科书里也会说,冒泡排序法是人们最熟悉,及最直观的排序法,我可不这样认为。或许老外在生活中用的是这种最笨的排序法?我猜想,大家在生活中99%使用后面要讲的“选择”排序法。 冒泡排序是这么一个过程(从小到大): 1、比较相邻的两个元素,如果后面的比前面小,就对调二者。反复比较,到最后两个元素。结果,最大值就跑到了最末位置。 2、反复第一步,直到所有较大值都跑到靠后的位置。 看一眼例子: 2,5,1,4,3 第一遍: ·比较第一对相邻元素:2,5,发现后面的5并不比2小,所以不做处理。序列保持不变:2,5,1,4,3

·继续比较后两对元素:5,1,发现后面的1比前面的5小,所以对调二者。现在,序列变为:2,1,5,4,3 ·继续比较后两对元素:5,4……对调,于是:2,1,4,5,3 ·继续比较后两对元素:5,3……对调,于是:2,1,4,3,5 <----- OK,现在最大值5跑到最尾处了。 大泡泡“5”浮出来了,但前面的2,1,4,3,还是没有排好,没事,再来一遍,不过,由于最后一个元素肯定是最大值了,所以我们这回只排到倒数第二个即可。 第二遍: ·比较第一对相邻元素:2,1,发现1比2小,所以对调:1,2,4,3,5 ·继续比较后两对元素:2,4,不用处理,因为后面的数比较大。序列还是:1,2,4,3,5 ·继续 4,3,对调:1,2,3,4,5。 前面说,5 不用再参加比较了。现在的序列是1,2,3,4,5。接下来,我们再来一遍: 第三遍: ·比较第一对相邻元素:1,2:不用对调。 ……等等…… 有人说,现在已经是1,2,3,4,5了,完全是排好序了啊,何必再来进行呢?我们确实是看出前面1,2,3也井然有序了,但对于程序来说,它只能明确地知道自己已经排好了两个数:4,5,并不知道的1,2,3凑巧也排好了。所以它必须再排两次,直到确认把3和2都已推到合适的位置上。最后剩一个数是1,因为只有一个数,没得比,所以这才宣告排序结束。 那么到底要排几遍?看一看前面的“第一遍”、“第二遍”的过程你可发现,每进行一遍,可以明确地将一个当前的最大值推到末尾,所以如果排 Count 个数,则应排 Count 遍。当然,最后一遍是空走,因为仅剩一个元素,没得比较。

基于OpenCV的图像轮廓提取方法的实现

基于OpenCV的图像轮廓提取的实现 【摘要】OpenCV是近几年来推出的一个开源的、免费的计算机视觉库.OpenCV的目标是构建一个简单易用的计算机视觉框架,利用它所包含的函数帮助开发人员方便快捷地实现图像处理和视频处理。而图像的轮廓是图像的一种基本特征,携带着一幅图像大部分的信息,经常被应用到较高层次的图像应用中。它在图像分离,图像识别和图像压缩等领域有很广泛的应用,也是图像处理的基础。本文首先阐述了OpenCV的特点和结构,然后采用一系列的可行性算法来获取图像特征参数并通过各种算子(Sobel算子,Laplace算子,Canny算子)对图像的灰度进行分析,调节,用实现对图像的边缘检测和轮廓提取。 【关键词】OpenCV 图像轮廓提取

The realization of the image contour extraction based on OpenCV 【Abstract】OpenCV is launched an open source in recent years.Free computer vision library. OpenCV's goal is to build a simple and easy to use computer vision framework, function to help developers use it contains quick and easy to realize image processing and video processing.And the outline of the image is a basic feature of image, carrying an image, most of the information is often applied to the higher level of the image application.It in image separation, image recognition and image compression, and other fields have a wide range of applications, is also the basis of image processing.At first, this paper expounds the characteristics and structure of OpenCV, then a series of the feasibility of the algorithm is used to obtain image feature parameters and through a variety of operator (Sobel operator, Laplace operator, Canny operator) analysis of image gray level, adjustment, use of image edge detection and contour extraction. 【Key words】OpenCV Image Contour extraction

相关主题
文本预览
相关文档 最新文档