標籤:

怎麼對下面的程序提高運算速度?

最近在寫一個程序,利用高速ccd採集圖像並處理。現在遇到一個問題,圖像採集速度比處理速度快,導致採集停止時圖像並沒有處理完。現在的程序希望是來一幀處理一幀,fps是200多一點。之所以是實時處理是因為這一幀的輸出對下一幀的圖像有影響。請問我應該怎麼做來加快處理速度?200點fps算是很高嗎?明天能把程序的圖貼上來。

第一幅圖是主程序,主要是利用vision express的high level grab改的.兩個黑色和灰色的是子VI, 按從左到又的順序分別是下面兩幅圖. 程序主要是利用CCD採集的光斑, 第一個子VI是去背景, 思想是取ccd面上的四個角的平均像素值, 去掉雜訊, 輸出去雜訊之後的圖像, 第二個子VI是用labview自帶的算中心的函數, 計算選定ROI的中心, ROI範圍在主程序前面板輸入. 輸出的中心利用移位寄存器不斷在一個數組後面添加新的處理數據. 程序大概是這麼個意思.感覺最耗時間的貌似是去背景的VI.


對LabVIEW IMAQ模塊用的不多,回答僅供參考。

你現在拖慢每個loop的是你的處理過程,200+fps還是挺快的,如果你等待處理之後再採集下一幀的話,處理時間不能超過4~5ms。

具體建議,

1. 先看看每一步操作具體費時多少,參照https://zone.ni.com/reference/en-XX/help/371361J-01/lvhowto/profiling_vis/ 或者簡單地給你想查看的VI前後加上Get (high resolution) time https://decibel.ni.com/content/docs/DOC-23915 計算。

2. 在保證不犧牲質量的前提下,在mode(IMAQ或者IMAQmx里有)里選擇盡量小的解析度,畫幅越小數據量小,處理的越快。

3. 使用Pipeline設計 https://zone.ni.com/reference/en-XX/help/371599H-01/lvfpgaconcepts/fpga_pipelining/ 把你的處理步驟拆分,然後用寄存器傳遞圖像給下一步,這樣每次循環的時間就是你最小處理單元中執行最長的那個時間。

4. 如果細分後的每步處理時間還是大於採集時間,就buffer一下採集的信號,集中處理。參見IMAQ中的buffer資料。

我沒有建議使用生產者消費者架構,因為IMAQ中傳遞的是pic reference,一改全改,不像傳統的數據流,所以這個架構可能不實用。

5. 如果只要保證實時而不需要保證不丟幀,可以用生產者消費者循環加Lossy Queue來傳遞採集的圖像,來不及處理的就即時丟掉了。


圖像引用用隊列確實比較麻煩,轉化到數組分配內存對CPU和RAM都有一定的消耗。

我之前做的是一個高解析度圖像採集分析保存的應用。當時是轉換成UINT16數組發送到隊列然後再用自定義的演算法計算MTF什麼的,優化半天發現最靠譜的還是加錢上雙路E5。

你現在的CPU和內存佔用率如何?

如果CPU計算不過來,建議屏蔽部分計算比如抽幀或者縮小解析度。也可以配固態硬碟陣列先存下來然後再分析。

內存不足建議加內存換64bit的LabVIEW,之前我的一個一億像素圖像處理程序全靠配了32G內存才跑動。


推薦閱讀:

labview編程 基本函數發生器為什麼鋸齒波出不來?
學labview對學嵌入式有什麼幫助嗎?
Python和LabVIEW計算性能對比
推薦一個免費的LabVIEW SVN插件Viewpoint TSVN Toolkit

TAG:編程 | CCD | LabVIEW |