LabVIEW中圖像顯示為錯誤的圖像
LabVIEW中圖像顯示為錯誤的圖像
使用視覺與運動函數(shù)選板中的VI進行圖像顯示,所有的連線都正確,但是顯示的圖像卻是錯誤的。該如何解決這個問題?
解決方案
如果出現(xiàn)這種現(xiàn)象時候沒有收到任何的錯誤提示,那么原因很可能是出現(xiàn)了競爭情況。LabVIEW中的圖像數(shù)據(jù)類型有點不同于普通數(shù)據(jù)類型,因此我們需要簡單了解一下圖像數(shù)據(jù)類型的內(nèi)容來幫助我們解決這個問題。有關(guān)LabVIEW圖像數(shù)據(jù)類型的詳細內(nèi)容,請參閱LabVIEW圖像數(shù)據(jù)類型?。
因為圖像通常包含了大量的數(shù)據(jù),因此圖像采集NI-IMAQ的驅(qū)動和API需要創(chuàng)建一個內(nèi)存緩沖區(qū)來傳遞圖像數(shù)據(jù),這是通過IMAQ?Create?VI完成的

Image?Name必須是唯一的,它代表了此特定內(nèi)存的名字,這塊內(nèi)存將會被寫入或者覆蓋多次而不會產(chǎn)生新的內(nèi)存分配。New?Image簡單的就是一個對該物理內(nèi)存的引用,用以儲存該圖像。
很多的圖像處理VI有多個圖像輸入,通常來說Image?Src?和?ImageDst是圖像輸入接口,而Image?Dst?Out是輸出接口,可以參考下面的IMAQ?Threshold?VI。

如果Image?Src有連線,而Image?Dst沒有連線,則Image?Dst?Out會指向Image?Src的內(nèi)存緩沖區(qū),而如果兩個輸入接口都連線了,ImageDst?Out會指向Image?Dst的內(nèi)存緩沖區(qū)。
編程人員需要特別注意,因為一旦沒有為每個輸入初始化足夠的內(nèi)存緩存區(qū),可能就會造成對已經(jīng)有的內(nèi)存進行覆蓋。如果你想在每個圖像處理步驟中都保存對應(yīng)圖像,就可能會出現(xiàn)上述的問題。
請考慮以下示例:


上例中只有一個內(nèi)存緩沖區(qū)。Image?Display?2毫無疑問會顯示圖片2;但是取決于執(zhí)行的順序,Image?Display?1則有可能顯示圖片1或者圖片2。如果Display?1在IMAQ?Threshold調(diào)用前完成刷新則顯示圖片1,否則將顯示圖片2。
現(xiàn)在來看第二個例子:

本例中有兩個內(nèi)存緩沖區(qū),一個是原始圖像,一個是閾值化后的圖像?,F(xiàn)在ImageDisplay?1將會顯示圖像1,因為它引用了Image1的圖像數(shù)據(jù)緩存,Image?Display?2則會顯示經(jīng)過二值化處理后的圖片2,因為它引用了Image?Dest的圖像數(shù)據(jù)緩存。
很多IMAQ?和?VisionVI都有類似Source和Destination的輸入接口。其工作原理是:一旦Destination的輸入接口沒有連線,VI就會將結(jié)果圖像數(shù)據(jù)覆蓋輸入的圖像數(shù)據(jù);而一旦Destination的輸入接口連線,結(jié)果圖像數(shù)據(jù)就會放到Destination指定的內(nèi)存緩沖區(qū)中,同時保留Source指定的內(nèi)存緩沖區(qū)中的輸入圖像數(shù)據(jù)。
對于所有創(chuàng)建的圖像內(nèi)存緩沖區(qū),IMAQ?Dispose?VI用以釋放由IMAQ?Create?VI創(chuàng)建的內(nèi)存數(shù)據(jù)。

IMAQ?Dispose?VI應(yīng)當在圖像不再需要時調(diào)用。例如當一副圖像從子VI中傳遞到主VI,此時若在子VI中調(diào)用了IMAQ?Dispose?VI將會釋放該圖像數(shù)據(jù),那么主VI就無法獲取圖像的內(nèi)存數(shù)據(jù)。這樣該圖像就無法再被處理或者顯示了。