解决方案
如果出现这种现象时候没有收到任何的错误提示,那么原因很可能是出现了竞争情况。LabVIEW中的图像数据类型有点不同于普通数据类型,因此我们需要简单了解一下图像数据类型的内容来帮助我们解决这个问题。有关LabVIEW图像数据类型的详细内容,请参阅
LabVIEW图像数据类型 。
因为图像通常包含了大量的数据,因此图像采集NI-IMAQ的驱动和API需要你创建一个内存缓冲区来传递图像数据,这是通过IMAQ Create VI完成的
Image Name必须是唯一的,它代表了此特定内存的名字,这块内存将会被写入或者覆盖多次而不会产生新的内存分配。
New Image简单的就是一个对该物理内存的引用,用以储存该图像。
很多的图像处理VI有多个图像输入,通常来说
Image Src 和
Image Dst是图像输入接口,而
Image Dst Out是输出接口,可以参考下面的IMAQ Threshold VI。
如果
Image Src有连线,而
Image Dst没有连线,则
Image Dst Out会指向
Image Src的内存缓冲区,而如果两个输入接口都连线了
,Image Dst Out会指向
Image Dst的内存缓冲区。
编程人员需要特别注意,因为一旦你没有为每个输入初始化足够的内存缓存区,可能就会造成对已经有的内存进行覆盖。如果你想在每个图像处理步骤中都保存对应图像,就可能会出现上述的问题。
请考虑以下示例:
上例中只有一个内存缓冲区。Image Display 2毫无疑问会显示图片2;但是取决于执行的顺序,Image Display 1则有可能显示图片1或者图片2。如果Display 1在IMAQ Threshold调用前完成刷新则显示图片1,否则将显示图片2。现在来看第二个例子:
本例中有两个内存缓冲区,一个是原始图像,一个是阈值化后的图像。现在Image Display 1将会显示图像1,因为它引用了
Image1的图像数据缓存,Image Display 2则会显示经过二值化处理后的图片2,因为它引用了
Image Dest的图像数据缓存。
很多IMAQ 和 Vision VI都有类似Source 和 Destination的输入接口。其工作原理是:一旦Destination的输入接口没有连线,VI就会将结果图像数据覆盖输入的图像数据;而一旦Destination的输入接口连线,结果图像数据就会放到Destination指定的内存缓冲区中,同时保留Source指定的内存缓冲区中的输入图像数据。
对于所有创建的图像内存缓冲区,IMAQ Dispose VI用以释放由IMAQ Create VI创建的内存数据。
IMAQ Dispose VI应当在图像不再需要时调用。例如当一副图像从子VI中传递到主VI,此时若在子VI中调用了IMAQ Dispose VI将会释放该图像数据,那么主VI就无法获取图像的内存数据。这样该图像就无法再被处理或者显示了。