最近對VP的數據協議進行了反思,昨天進行了重大改進,去掉了智能指針的使用,在模塊內部使用了緩存區概念,既方便了內存管理又極大地提高了效率,性能檢測結果對比如下:
改進之前:
改進之後:
上述所有的數字都以cpu時鐘週期爲單位。
運行結果還是不太滿意,繼續追蹤各個模塊的運行時間,結果大大出乎意料,從IplImage到QImage的轉化函數居然這麼耗時,性能檢測結果如下:
注意其中的CvImage2QImage的執行時間。 跟蹤那段函數代碼,使用的兩重循環執行圖片的轉化:
下面是改進的代碼:
改進後的性能檢測結果如下:
原因分析:
第一種情況要差不多23個時鐘週期,然後第二個卻只需要4個時鐘週期,效率差距這麼大。原因在於opencv中圖片存儲是按行存取,所以行優先處理可以更加符合程序的局部性原理。
尾聲
對於一個實時性強的系統每秒處理幾十幀,從一幀處理147個時鐘週期到16個時鐘週期。。。
一種更好的改進:
通過QImage和IplImage共享內存,需要注意的是,QT中的的圖片是RGB格式,而OpenCV攝像頭獲得圖片是BGR格式。具體實現代碼如下:
經測試,對於640*480的幀圖片,轉化爲qimage只需要五個時鐘週期左右。
add: 2011/1/14 by RYF