在LabVIEW的影像顯示不正確



主要軟體:
主要軟體版本: 2.0
主要軟體修正版本: N/A
次要軟體: N/A

問題: 在使用Vision and Motion面板中的image display功能,當把所有的接線都接好了之後發現顯示影像會不如預期。應該要如何修正這樣的問題?

解答:
如果沒有收到任何error訊息但卻還是看到這樣的現象,很有可能是發生了race condition。在LabVIEW中的image type有一點特別的地方會需要先了解,可以先參考關於這方面的說明會對於以下的說明的了解會有所幫助。關於image datatype的細節請參考文末的知識庫連結。
典型的影像會包含相當大量的資料,因此在使用影像擷取的driver以及API, NI-IMAQ時,會需要在PC memory上先建立一個buffer做為傳遞到LabVIEW的buffer。而這樣的動作可以透過IMAQ Create VI完成。
其中input的Image Name必須是獨一無二的,且代表著對應的buffer名稱。這個buffer可以被寫入,且在沒有分配新的memory的情況下會被覆寫。而輸出的New Image則是對應到存放影像的實際物理位置的reference。

許多影像處理的VI都會有多個影像的輸入。通常包含了輸入的Image Src,Image Dst,以及對應到輸出的Image Dst Out。請參考下面以IMAQ Threshold VI的例子。
如果使用的是Image Src輸入點而非Image Dst的話,所對應的Image Dst會指向Image Src的buffer。如果兩個都接的話,則Image Dst Out輸出則會指向Image Dst輸入。
撰寫程式的人會需要注意這點,如果沒有初始化足夠的buffer給input的話,就很有可能會將buffer內的資訊覆寫。當然這對於不需要保留影像的程式並沒有什麼太大的問題。
請參考下圖的範例。
在這個範例中,只有一個buffer。理論上Image Display 2會顯示的當然會是執行Threshold後的Image Display 2,但執行的順序就可能會影響Image Display 1了。如果Image Display 1在執行IMAQ Threshold之前就更新的話,那就會顯示Display image 1預期要顯示的影像。但如果順序是在之後,那就會與Image Display 2相同了。接著來看看第二個例子。
 
在這個例子中,有建立了兩個buffer,分別是給原先擷取的影像以及給Threshold處理後的影像。這樣的狀況下,兩個影像都可以顯示原先希望顯示的。其中Image Display 2則會顯示IMAQ Threshold處理後的結果,原因是這邊已經把影像的輸出去指向Image Dest這個buffer了。
 
許多的IMAQ以及Vision Vis在LabVIEW中都會包含這兩種輸入Image Source以及Image Destination。規則如下:無論什麼時候,在destination input沒有接線的情況下,VI就會把處理後的影像覆蓋掉原先的。而當destination input指定buffer時,處理後的影像就會被放置到對應的buffer,並且不影響原先buffer上的影像。
 
比較需要注意的是,buffer建立後,必須在程式的最後或是適當的時間點使用IMAQ Dispose VI去將當初IMAQ Create VI所建立buffer對應的memory去釋放掉。
IMAQ Dispose VI在執行前必須先確認對應影像是不會再被使用的。舉例來說,如果有一個影像從subVI傳遞到main VI,在subVI如果有使用Dispose VI就會造成在main VI取得影像前就把對應影像的buffer釋放掉。也因此該影像在main VI就無法被確實使用到。


相關連結: KnowledgeBase 4R6E2GGL: Image Datatypes in LabVIEW
Developer Zone Tutorial: Why Dataflow Programming Languages are Ideal for Programming Parallel Hardware
Developer Zone Tutorial: Why LabVIEW for Multicore Programming
Tutorial and Video: Dataflow, SubVI, and Parallelism in NI LabVIEW


附加檔案:





報告日期: 11/05/2008
最後更新: 03/22/2015
文件偏號: 4R4G1RGL