注册登陆后可查看附件和大图,以及购买相关内容
您需要 登录 才可以下载或查看,没有账号?注册会员
x
LabVIEW Vision图像处理开发宝典-第三章 功能函数与主程序-第一节 功能函数与模块-1.1 Camera相机模块-1.1.1 打开相机
1.1.1 打开相机
图4 打开相机(真)
图4 打开相机(真)
图5 打开相机(假)
图5 打开相机(假) 图4、图5所示,为打开相机的状态机。在While外面只添加输入控件相机操作、Image In、错误输入几个控件。相机操作属于状态机命令,需要从调用函数中指定具体的命令,以执行不同的状态机,如打开相机、采集图像、关闭相机等。图像输入,则指定了采集图像时图像缓存的内存空间。一般来讲,这个参数可以在主程序中引入。主程序可以根据相机的类型(黑白、彩色)分配不同的内存空间,如GrayscaleU8、RGBU32等。当然如果程序使用的相机已经固定好了,可以将图像输入去掉,这时在打开相机时,会检查图像输入缓存是否有效,如果无效,则会自动创建一个默认的8位灰度图像缓存空间,如图4所示,上面一个条件结构,图像缓存无效时,根据VI名创建一个图像缓存空间。如果将图像输入去掉,那么后面的非法句柄引用判断以及条件结构也可以一起去掉,这样就成为直接创建新的图像缓存,这样至少要少判断几项内容,可以提高程序的执行效率。虽然这个提高不会很明显,但是大型程序的效率提高,就是由这些细小的内容改善一点一滴积累的。 同理,相机引用也使用了这样的道理。但是相机引用在这里,并没有接入输入控件,因为我们使用的是状态机,这里就没有使用输入控件,而是在打开相机的状态机中,通过枚举相机IMAQdx Enumerate Cameras VI、索引数组、按名称解除捆绑、打开相机IMAQdxOpen Camera VI等函数,直接打开相机获得相机引用。如果编程人员比较了解,可以直接在打开相机中输入接口名称的字符串,NI相机名称字符串,一般是以cam1、cam2、cam3等方式调用的。相机名称,可以在MAX中查看得到。当然,也可以通过枚举索引的方式获得,这样的话,就需要注意当系统中有多个相机时,需要打比赛索引哪个相机。同样,相机序号也可以在MAX中看到。 由上面这些理念可以修改打开相机状态机,如下图所示:
图6 修改简化打开相机
图6 修改简化打开相机 通过以上的修改,打开相机就变得简洁了。在图6所示的简化打开相机中,需要注意IMAQ Create创建的内存,其名称不能与其它VI中的创建的内存名一样,如果一样,则会与其它VI中的图像共用一块内存区域,有可能图像会被彼此覆盖;名称可以直接使用常量,这样会虽然有可能会重复,但是比属性读取要快速;另外打开相机的Session In引用输入,可以使用引用控件,也可以使用字符串常量。使用字符串常量,则由用户直接指定,使用引用,则是枚举量,会枚举系统中的已有的资源,跟VISA打开串口类似。 条件结构中,通常需要指定一个默认分支,在这里,没有设置其它的空分支,因此直接使用了打开相机当作默认分支。 状态机的连续控制由WHILE循环来控制,因为一般的状态都是不会连续控制的,因此为了方便编程,将WHILE的控制端设置成真时继续,这样当不需要继续时,只需要使用默认值假就可以,只有需要继续循环的,才会设置成真。如果继续循环,下一循环状态,则WHILE右上角的下一循环指令来指定,它会将指令传递给WHILE中的移位寄存器,而下次循环时会读取寄存器中的值,从而决定条件结构执行哪个分支,以达到不同的状态控制的目的。同理,如图像引用、相机引用等,也使用了移位寄存器。移位寄存器在当前VI加载在内存中时,其中的值都是不会丢失的,可以有效的传递数据。
|