石鑫华视觉 发表于 2016-11-15 11:27:23

3.1.12 IMAQ Create Copy Dispose状态机综合应用

3.1.12 IMAQ Create Copy Dispose状态机综合应用Create创建图像缓存在《LabVIEW Vision图像处理开发宝典》中,有介绍ImageforUse这个关于图像缓存的状态机。在这里我们也介绍一下,方便未有看过《LabVIEW Vision图像处理开发宝典》的看观了解图像缓存的更多灵活用法。状态机是作为一个子函数进行调用的,而不是在主程序中直接使用的。这样可以在需要的地方直接调用相关的函数功能即可。下面具体了解一下ImageforUse函数本身:ImageforUse_x前面板这里的Command命令是一个枚举变量,可以设置成自定义变量。其中包含了Create、Use、Copy、Dispose四个指令,分别对应创建、使用、复制、释放四个状态。状态机命令**** Hidden Message *****ImageforUse_0程序框图-Create创建图像缓存ImageforUse函数同样使用了状态机,只不过这里的状态机,循环条件一直是真-停止的,全部只有一次执行过程,也没有下一状态机指令控制,不能在状态机里连续循环控制。因此要执行不同的状态机,只能在调用程序中调用不同的状态。这个创建图像内存函数其实是可以直接在主程序中使用引用进行操作的,就如3.3.8中的大恒相机驱动程序:**** Hidden Message *****使用IMAQ Create直接在主程序中创建图像缓存但是这种方法,给主程序的界面造成了比较大的困扰,如果程序的图像多一些,会有许多的连线,如上图所示,就有两条线,然后要做成移位寄存器。如果有双相机,则会有4条线。每个分支都需要连续,很麻烦。所以有效的方法,是将图像缓存这一块,子函数化,然后在子函数中使用移位寄存器来保存图像的引用,在有需要的地方,直接调用子函数,即可完成需要的功能,方便快捷。Create状态机中调用的是IMAQCreate函数,这里需要注意,其缓存名需要与其它的函数区分开来,上面的缓存名为Image Use_0,还可以继续设置其它的子函数为Image Use_1、Image Us_2、Image Use_3、Image Use_4、Image Use_5等。**** Hidden Message *****ImageforUse_1创建程序框图如果不想使用这种常量模式,也可以考虑与VI名称等变量关联起来,如下图所示:自动建立图像缓存名称    通过上图所示的方法,使用VI属性,将当前VI的名称与路径读取出来,然后变成图像缓存名,可以自动建立图像缓存名称。这时,只需要VI名称和路径不一样,即可得到不同的缓存空间,基本上不会有重复。NI许多例子里的图像缓存就是基于这种方法生成的。另外是要注意它的图像类型(ImageType),如果是彩色相机,需要设置成RGB(U32)形式。Border Size边界尺寸,一般使用默认值3即可。这里不建议使用0值,因为许多函数都需要借助边界,如果边界不足,会出错。关于Create的更多细节,请参考本章前面的章节。当主程序调用了上面方法创建了图像缓存后,因为这个状态机VI会一直在内存中,图像引用也会一直在移位寄存器中保存着,因此后面是可以直接使用其引用的。**** Hidden Message *****主程序中调用ImageforUse_0、ImageforUse_1   上图为大恒驱动的初始化中调用ImageforUse_0、ImageforUse_1,并且将两个子函数的状态指令设置为Create创建,这样就可以完成图像缓存的创建了。Use使用图像**** Hidden Message *****Use使用图像缓存上图所示的状态机,为使用图像缓存。当图像缓存创建好了以后,在有需要使用图像缓存的地方调用函数,并将状态机设置为Use,即可使用已经创建的图像缓存。使用图像缓存不需要调用任何函数,只是借用了状态机中的移位寄存器,即可将图像缓存中的引用读取出来,然后缓存图像,例如需要图像采集的地方:**** Hidden Message *****使用ImageforUse_0的图像缓存-用于采集单帧、连续采集连续采集效果Copy复制图像**** Hidden Message *****Copy复制图像在编程时,经常会复制图像,如将原始图像复制出来,用于预处理分析等。这时就需要使用复制功能。在ImageforUse中,也有复制功能,使用的是IMAQ Copy函数。这里的复制是指将别的图像复制到当前的图像缓存中。当然,你也可以修改连接关系,把当前的图像复制到其它的缓存中(就是将图中的Image Src与移位寄存器的输入端位置Dst互换即可)。**** Hidden Message *****Copy复制功能在主程序中实现-图像处理上图中的复制,就是将ImageforUse_0中的图像复制到ImageforUse_1中,然后经过抽取颜色平面函数抽取颜色后再放回ImageforUse_1缓存中。这样ImageforUse_0中的原始图像没有被覆盖而被保留下来了(ImageforUse_0中的图像是由采集单帧或连续采集得到的)。图像处理效果**** Hidden Message *****Copy复制功能在主程序中实现-自动运行自动运行时,则先使用ImageforUse_0中的图像缓存,然后相机采集图像后放置到ImageforUse_0中,然后再使用ImageforUse_1的复制功能,将ImageforUse_0中的图像复制到ImageforUse_1中,进行颜色平面抽取后再放置到ImageforUse_1中。自动运行效果Dispose释放图像缓存**** Hidden Message *****Dispose释放图像缓存图像缓存使用完后,最后也是需要释放图像缓存空间的。一般用在程序退出时。使用的是IMAQ Dispose函数。释放图像中的Image Out仍然连接了线,但是经过IMAQ Dispose函数后,已经是无效的图像引用了,这里只是为了保证没有松散的连线,当然也可以不连线,而是在条件结构中使用默认值即可。释放图像操作,可以只在某一个函数中设置状态,并且将All Image?(No)设置为Yes,这样只需要调用有该函数的一个函数即可释放掉所有图像缓存。这里我们为了程序的规范性与通用性,在每个子函数中均有释放操作,在程序退出时,也都针对每个子函数进行了释放图像缓存的操作:**** Hidden Message *****Dispose释放图像的调用例子下载:本实例具有实际使用意义,并带大恒图像千兆网系列相机驱动程序,因此实行收费下载。LabVIEW版本2014SP1

hyf1279 发表于 2019-10-9 08:27:28

这里的Command命令是一个枚举变量,可以设置成自定义变量。其中包含了Create、Use、Copy、Dispose四个指令,分别对应创建、使用、复制、释放四个状态。

yangzhifu 发表于 2019-11-22 11:14:01

石鑫华视觉网http://shixinhua.com,工业相机、工业镜头、机器视觉光源、光源控制器、图像处理、系统集成服务商

效联朗 发表于 2019-7-26 15:20:14

石鑫华视觉网http://shixinhua.com,工业相机、工业镜头、机器视觉光源、光源控制器、图像处理、系统集成服务商

一休哥 发表于 2016-11-15 11:34:09

淘宝机器视觉商城,明码实价,童叟无欺!https://visionbbs.com/

wangqiuxiang 发表于 2016-11-18 17:39:50

特价工业相机、机器视觉光源、工业镜头、机器视觉教程,就到机器视觉商城http://visionbbs.com

meng_zhao 发表于 2016-12-12 13:57:35

学习学习,谢谢

weizuqiang 发表于 2017-3-31 22:38:55

机器视觉商城供应各种图像采集卡,1394卡、千兆网卡、IO卡。进视觉商城http://visionbbs.com选购吧

ptxy8023 发表于 2017-4-6 22:38:34

看看学习下资料

blqzhou 发表于 2017-4-9 22:32:33


学习学习,谢谢

EGO666 发表于 2017-4-26 09:45:33

谢谢大神分享

btlec0553 发表于 2017-4-27 10:14:06

谢谢楼主分享

weizuqiang 发表于 2017-4-29 22:19:12

机器视觉商城http://visionbbs.com,中国真正的机器视觉与图像处理网上商城
页: [1] 2 3 4 5 6
查看完整版本: 3.1.12 IMAQ Create Copy Dispose状态机综合应用

LabVIEW HALCON图像处理入门教程(24.09)
石鑫华机器视觉与LabVIEW Vision图像处理PDF+视频教程11种全套
《LabVIEW Vision函数实例详解2020-2024》教程-NI Vision所有函数使用方法介绍,基于NI VISION2020,兼容VDM21/22/23/24