2014-10-22 72 views
1

我有一個擁有自己的一組API的全局快門的花式相機。我一直在試圖做的是初始化相機並在精確的定時循環中觸發快門。相機API然後返回一個指向圖像第一個像素的指針(我們稱它爲image.bp)。從指針創建墊

我的代碼看起來是這樣的:

XI_IMG image; //image type specified by the manufacturer. the image.bp points to the first pixel of the image 
camera initialization ... 
for(;;){ 
    xiGetImage(xiH, timeOut, &image); //API given by the camera manufacturer 
    Mat frame(image.height, image.width, CV_8U, image.bp); 
    imshow(window_name,frame); 
} 

現在這個代碼工作。但是我一直試圖做的是在for循環之前將「frame」定義爲Mat,所以我不會在每個循環中重新定義它(如果我錯了,糾正我,但是在每個循環中重新定義它將是非常低效的)。但是我所嘗試過的一切都失敗了。

任何幫助將不勝感激!

+2

'糾正我,如果我錯了,但在每個循環中重新定義它將是非常低效的'您可能錯了,現代編譯器可以優化罰款。即使存在懲罰,只有在性能分析後明顯影響應用程序的速度時才應該對其進行更改。 – user657267 2014-10-22 00:13:58

+0

我目前看不到任何特別的問題。只是想看看是否有其他方法可用於比較。在這種情況下,我不介意錯誤。只是讓我的生活更輕鬆。感謝您的幫助:) – 2014-10-22 00:25:15

+0

順便說一句,還有一個問題一直困擾着我。我是否需要在imshow之後做一個frame.release()?謝謝 – 2014-10-22 00:30:48

回答

4

存在frame.dataMat::data成員),您可以在每次使用xiGetImage代碼獲取新幀時重新分配該成員。當您這樣做時,請確保使用有效的圖像指針初始化對象frame,而不是省略最後一個參數。這樣,你的Mat對象將不會分配自己的內存(並最終泄漏它)。

XI_IMG image; //image type specified by the manufacturer. the image.bp points to the first pixel of the image camera initialization ... 

xiGetImage(xiH, timeOut, &image); //API given by the camera manufacturer 
Mat frame(image.height, image.width, CV_8U, image.bp); 

for(;;){ 
    xiGetImage(xiH, timeOut, &image); //API given by the camera manufacturer 
    frame.data = image.bp; 
    imshow(window_name,frame); 
} 

此外,

  1. 我想關於編譯器優化器的意見是正確的,以在一定程度上也是。您的Mat構造函數將只分配堆棧分配的部分,並且不會執行任何堆分配(因爲您指定了自己的數據指針)。由於每個幀的堆棧分配部分大小完全相同,我假定編譯器至少會重複使用相同的地址。在設置每個幀的寬度和高度時可能會有一些開銷,但這是非常小的工作量。

  2. 我高度懷疑image.bp中的地址指針是穩定的,不會改變每一幀。驅動程序更喜歡重新使用預先分配的內存,而不是對堆進行分段。如果是這種情況,您甚至可以省略上面的行frame.data = image.bp;

+0

謝謝。這回答了我的問題。 – 2014-10-22 05:57:29