石鑫华视觉 发表于 2016-11-3 09:41:06

3.1.2 创建图像缓存的注意事项

3.1.2 创建图像缓存的注意事项在IMAQ Create函数创建的临时内存位置,都是作为Image图像引用使用的,即后面其它的所有函数,都使用这个地址的引用,并对引用中的图像进行操作。IMAQ Name为创建的引用的名称。在同一个程序中,如果需要分配多个不同的缓存,需要利用IMAQ Name的不同,进行区分。在函数的IMAQ Name接线端上鼠标单击右键>创建>常量,则会创建一个字符串常量,并且会自动命名为Untitled(未命名),用户可以对其进行命名,可以使用英文,也可以使用中文。以经验来看,一个相机的视觉系统,我们至少都需要两个图像缓存,一个为原始图像的缓存,一个为处理图像的缓存(少数不改变图像类型的,如将彩色转换成灰度、灰度转换成二值图像,则可以只建立一个缓存)。之所以要这样分开,是为了方便图像处理的过程中,不将原始图像改变。因为有些图像处理函数处理过后,原始图像的信息是会丢失许多的,而且是不可逆的,如二值化、滤波、形态学等,而如果在图像处理过程中,在后面的一些函数中还需要原始图像时,这时可以通过复制,将原始图像再复制过来使用,而不会将原始图像用处理后的图像代替。如果有需要,可能需要三到四个图像缓存。像Image To Image函数就需要四个图像缓存。在NI的VDM中常用的几类图像缓存有:图像源(Image Src)、图像目的地(Image Dst)、图像掩码(Image Mask)、模板(Template)等几类。Image Type图像类型在IMAQ Create函数的下面有一个接线端为ImageType图像类型,其可以指定图像缓存用于存储哪种类型的图像,如Grayscale(U8)无符号8位灰度图像、Grayscale(I16)有符号16位灰度图像、Grayscale(SGL)单精度形灰度图像、Complex(CSG)复数形图像、RGB(U32)无符号32位RGB彩色图像、HSL(U32)无符号32位HSL彩色图像、RGB(U64)无符号64位RGB彩色图像、Grayscale(U16)无符号16位灰度图像等类型。其中Grayscale(U8)无符号8位灰度图像、RGB(U32)无符号32位RGB彩色图像两种类型使用的最多,因为一般的工业相机或摄像头,输出的图像要么是无符号的8位灰度图像,要么就是无符号的32位RGB彩色图像。图像类型选择不同,分配的缓存空间也不一样,图像类型需要选择正确,不然有可能不能正常显示,如图像源是彩色图像,而图像类型选择为灰度,则会自动转换成灰度图像而不能显示彩色图像。IMAQ Create Border Size边界尺寸上图所示为创建图像缓存时指定边界尺寸。这个参数的意义上节已经介绍了。可以了解到其意思为边界尺寸定义了以像素为单位的围绕图像四周的边界宽度。这些像素仅用于一些特殊的VI函数。如果图像在后面的处理过程中使用的函数需要边界,例如分类、形态学等(具体如移除粒子、膨胀、腐蚀等),则需要创建一个边界在应用程序开始前。函数默认的边界是3,有3个像素的边界,可以使用的核心算子(Kernel掩码)可以达到7x7而不需要更改。如果想使用大于7x7的算子在图像处理中,那么需要指定更大的边界当你创建图像缓存时。需要注意的是图像的边界仅仅只在图像处理中被引入计算,它不会显示或存储在文件中。边界尺寸对掩码的影响上图示意了边界尺寸对核心算子的影响。图中黄色区域表示了一个8x6的图像。如果需要处理红色区域代表的像素,使用7x7的掩码(图6中蓝色区域及蓝黄区域,即红色像素点为中心的7x7像素),那么需要处理的像素点会被置于掩码的中心位置,这时在处理像素的上边与左边,都还需要3个像素的位置来放置掩码。如果这时图像没有边界,或者是边界的数量达不到要求——≥(掩码尺寸-1)/2,那么就会报错。如下图所示的例子:图像边界未满足要求时出错错误为-1074396072,发生于IMAQRemove Particle移除粒子中,可能的原因是IMAQ Vision:Invalid image border。即无效的图像边界。因为在IMAQ Remove Particle函数中,默认使用的是3x3的掩码,而我们在创建图像引用时,边界尺寸设置为0了。因此会报无效图像边界的错误。如果将边界尺寸设置为1,再运行同样的程序时,则不会有错误发生,如图所示:图像缓存大于等于掩码需求的尺寸时在本节中之所以啰嗦的讲这么多IMAQ Create的细节,主要是因为许多初学者确实不太在意这些东西,认为只要创建了就OK了。其实,这里的创建,会影响到后面的函数。特别是IMAQ Name引用名与Border Size边界尺寸,这两个参数不注意,极易出错。边界尺寸不正确,上面已经讲了(通常来讲,不接线直接使用默认的3,出错的机会更少,因为掩码较少使用7x7以上的,^=^);而引用名的出错,通常反应在图像处理过程中,图像内存分配混乱,将处理后的图像输出到原始图像缓存空间中,各阶段的图像在不同的缓存中反复的覆盖,造成如原始图像丢失、Image Display显示图像闪屏等多种问题。

dengmeng 发表于 2023-8-22 15:23:59

钓鱼岛是中国的
页: [1]
查看完整版本: 3.1.2 创建图像缓存的注意事项

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