影像擷取+即時分析推薦架構寫法請益?

hi, 各位先進好:

想請教各位在寫即時影像分析時、

都是使用什麼架構?

目前我是使用雙迴圈+event& notify

其中一迴圈是使用event case來抓取使用者操作動作

另一迴圈則是處理擷取+分析+顯示的動作

但是目前遇到狀況是、可能因為分析的動作太多延遲變長後面 寫錄影動作時導致會有frame loss的狀況....

(也就是假如說原本機器是一秒15個frame, 但是後面錄實際寫入影像明顯低於15...)

請教要如何維持影像讀入FPS的速度 又可達到完整分析目的?

還是只有先完整紀錄影像、後端才來分析檔案才可行?

煩請各位先進不吝分享經驗架構.. 感謝。

架構沒有問題,
要排除可以考量兩種方案:
1. 更新硬體配備(這個應該不用解釋)
2. 將計算與擷取拆出獨立成一個迴圈

關於第二點簡單的概念就是:
1. 擷取/取樣的優先度高於計算/顯示
2. 優先度高的功能不要與延時性高的功能放在一個迴路
3. 設計定時擷取,並將資料放入QUEUE,以確保擷取的FRAME固定,
    同時分析迴圈由QUEUE中取得資料進行分析,以確保兩者可同步進行但不影響高優先權的功能執行
4. 若這樣設計還是會掉FRAME,則評估分析迴圈是否計算量是平均都很高,還是忽高忽低
    如果平均都很高(計算速度慢導致無法消化QUEUE資料),那就只能變更分析方式、提升硬體設備或是事後分析
    如果忽高忽低(計算不慢,一次計算與一次計算中有IDLE,但計算時佔用大量運算能力),
    那建議於計算迴圈中增加合理的延遲,以降低當佔用大量運算能力的同時,擷取功能又需動作,造成FRAME LOSS

以上淺見請指教


謝謝先進分享概念~

大概有點頭緒了^^ 謝謝

目前會先在擷取動作多加雙迴圈跟儲列、

把擷取跟分析分開測試看看

感恩喔>M<!

補充一下

在LabVIEW下處理IMAQ影像時可以使用Queue VIs嗎?

感謝ancle大的分享,連如此細微的地方都注意到了。
那就必須修正上述該系統將queue改用global陣列來作取代,
或是做一個VI暫存器來呼叫使用。

[QUOTE=caeru]感謝ancle大的分享,連如此細微的地方都注意到了。
那就必須修正上述該系統將queue改用global陣列來作取代,
或是做一個VI暫存器來呼叫使用。
[/QUOTE]

說實在我最近也被類似問題困擾,同樣是二個獨立迴圈,想在二個迴圈間做資料傳遞,不想用queue或variable的方式,你說的vi暫存器的方式,是否有經驗可以分享?謝謝!

[QUOTE=ancle]

補充一下

在LabVIEW下處理IMAQ影像時可以使用Queue VIs嗎?

[/QUOTE]

其實我對這篇文章抱持存疑的態度。嚴格來說,c++所有資料傳遞都只是傳pointer吧。

[QUOTE=Benjamin]

 
其實我對這篇文章抱持存疑的態度。嚴格來說,c++所有資料傳遞都只是傳pointer吧。

[/QUOTE]

如果仔細看的話,文章是"不建議",之前我也是遇過影像使用queue或local variable的問題,曾詢問過NI AE,解答內容和該KB大同小異,後來我儘量使用定點影像,就是擷取後馬上處理,這當然最好,但是如果遇到如作者的問題,真的是要看有什麼好方法,Ben對這方面應該很內行,把CUDA的好處介紹一下

做成子VI呼叫,
利用移位暫存器於非reentrant執行時會保留之前的狀態來當作一個假的全域變數使用,
CASE_INITIAL:清除移位暫存器

CASE_ENQUEUE:增加堆疊物件

CASE_DEQUEUE:取出堆疊物件


另,使用時比較麻煩的就是在sub VI外頭還得加上to variant以及variant to data才能正確解出來。
這樣做某種程度而言算是麻煩版的QUEUE的方式,但是應可以解決傳址的問題。

另「在LabVIEW下處理IMAQ影像時可以使用Queue VIs嗎?」中提到的傳址問題,
之前似乎有碰過,就是傳遞影像資料時,第一張影像擷取後放入queue後再擷取第二張放入queue
結果兩個讀出來都是第二張圖,但是忘了修改什麼之後就解決了這個問題…|||
ancle大提到之後才想到或許是傳址與傳值的差異性所造成…
但是現在手邊沒道具測不了="=

這種子VI呼叫好像也搞不定IMAQ影像、

他的說明是"

Queues VIs不建議搭配IMAQ影像資料型態來作使用。使用'IMAQ Create.VI'所創造出來的IMAQ影像資料型態並不是真正的影像資料,而是一個指向資料儲存位置的指標。

因此使用queue搭配IMAQ影像資料型態時,實際上傳遞的參數是記憶體位置而不是影像本身的資料。

因此若擷取到一個新的影像資料,由於傳遞的是影像位址,所以實際上新的影像並沒有被傳遞。

較恰當的方法是定點作影像處理或是將影像資料複製到另ㄧ個不會變動或丟棄的記憶體緩衝區"

如果直接以IMAQ type儲存、感覺也是只存到"影像位址", 通常擷取迴圈速度比分析迴圈快.. 位址內容更新後還是一樣會發生..

不然就是直接把影像轉成數值陣列方式作儲列.. 不然目前好似無解....

SurfersParadis41241.5894907407

[QUOTE=caeru]做成子VI呼叫,
利用移位暫存器於非reentrant執行時會保留之前的狀態來當作一個假的全域變數使用,
CASE_INITIAL:清除移位暫存器

CASE_ENQUEUE:增加堆疊物件

CASE_DEQUEUE:取出堆疊物件


另,使用時比較麻煩的就是在sub VI外頭還得加上to variant以及variant to data才能正確解出來。
這樣做某種程度而言算是麻煩版的QUEUE的方式,但是應可以解決傳址的問題。

另「在LabVIEW下處理IMAQ影像時可以使用Queue VIs嗎?」中提到的傳址問題,
之前似乎有碰過,就是傳遞影像資料時,第一張影像擷取後放入queue後再擷取第二張放入queue
結果兩個讀出來都是第二張圖,但是忘了修改什麼之後就解決了這個問題...|||
ancle大提到之後才想到或許是傳址與傳值的差異性所造成...
但是現在手邊沒道具測不了="=
[/QUOTE]

看起來caeru經驗豐富,所提供的程式看起來清爽有力,有機會我一定來試看看

先來講一下使用caeru所提供的vi使用心得,我覺得真是個好物,我測試的結果發現,如果enqueue後沒有dequeue把程式關掉後,再打開dequeue,如果沒有先initial還是可以dequeue到buffer的資料,只是當buffer裡沒有資料時再dequeue時會出現錯誤訊息,應該是variant to data轉換到空的constant variant的問題,另外不用polymorphic的方式就很好解資料了,我考慮我目前的問題是否用此方法來解決

[QUOTE=ancle]

先來講一下使用caeru所提供的vi使用心得,我覺得真是個好物,我測試的結果發現,如果enqueue後沒有dequeue把程式關掉後,再打開dequeue,如果沒有先initial還是可以dequeue到buffer的資料,只是當buffer裡沒有資料時再dequeue時會出現錯誤訊息,應該是variant to data轉換到空的constant variant的問題,另外不用polymorphic的方式就很好解資料了,我考慮我目前的問題是否用此方法來解決

[/QUOTE]
由於這不是正規的queue(汗),所以我處理錯誤的方式是把variant to data的error out接出,
當發生錯誤即代表:1. 之前輸入錯誤的資料,2. 輸出的資料為空
所以利用case來規避錯誤訊息導致中斷程式,同時依狀況可選擇輸出預設值或是不處理該筆資料

如果能達到polymorphic的功能我想這個程式就完善了。
當然也可以預設資料型態先行建立polymorphic選項,
但缺點就是變成只能應用在這些資料型態的傳遞,造成魚與熊掌的情況...

感謝兩位大大分享!  

請問大大這架構,IMAQ影像格式可用嗎?

((小弟機器出借給客戶了.. 暫時沒法TRY...

SurfersParadis41241.7040277778

1.To Variant可以轉換任何資料型態

2.這種FGV的方式,要注意的應該是buffer裡的資料什麼時候會被覆蓋

3.我剛才測試二種情況

A:分開enqueue不同的資料型態,再單獨dequeue不會出現解錯資料的情況

B:分開enqueue相同的資料型態,再單獨dequeue不會出現解錯資料的情況,只是順序不定

ancle大測試的沒錯,是我自以為有這樣的功能
Variant的部分我再看看有沒有其他更好的應用及偵錯方法

BufferSize的部份應該不用擔心,反而要擔心的是如果buffer不斷變大,則反而會拖慢程式速度。
下面的附件中則是將FGV加入BufferSize的限制,亦可避免此問題。

至於「分開enqueue相同的資料型態,再單獨dequeue不會出現解錯資料的情況,只是順序不定」
這部分似乎所有的enqueue都有這樣的問題,主要是順序控制上不固定,
不過我會用到多重enqueue的機制一般來說只是事件/數據,執行/分析的先後不同,並不影響整體架構。

至於跟queue的比較如下圖及附件:
附件為同時將亂數送入FGV以及queue,並同時讀出數據來確認兩者是否有不同。


TEST.rar

另IMAQ影像格式我這邊也沒東西可以嘗試,不過把IMAQ轉成數值陣列就確定可以用了,
只是應用很麻煩要轉來轉去的

不好意思 請問一下要怎麼將即時抓到的影像處理值直接做判斷式然後後面做功能的執行!!