2017-01-10 34 views
0

我使用的是GigEPRO攝像頭,並具有60fps的或更多基於圖像尺寸的能力。因此60fps表示1幀/ 16ms。但錄像機功能本身消耗2-4ms。所以我決定將圖像存儲在vector<Mat>並創建一個child_thread是負責使用來自OpenCV的writer功能通過訪問圖像爲載體和刪除存儲在圖像寫入圖像視頻。多線程視頻錄像機

我對這個實施幾個疑問。 我可以使用vector<Mat>來存儲圖像,還是應該創建隊列? 我怎樣才能與主線程同步child_thread?

我是新來的多線程編程,因此尋找一些投入

+0

你的數學是錯誤的。 60fps => 1000ms/60幀=每16.666 ...毫秒1幀。無論如何去耦合採集線程和寫入/記錄器線程與幀隊列之間是一個很好的理智的做法;-) – roalz

+0

哦。你好,謝謝你。但我不確定如何在編碼中實現。一般來說,我想通過減小圖像大小來將fps提高到100 fps。 – Reddy2810

+0

請參閱[此答案](http://stackoverflow.com/a/37146523/3962537)獲取靈感。 –

回答

1

去耦採集線程和作家/錄像機螺紋與-betweeen一幀隊列是一個很好的做法理智。

在一些點,輸入流可以比輸出寫操作更快(expecially如果編寫減緩裝置,例如磁盤)。
爲了防止不斷增長的隊列(會佔用PC上所有可用的內存),您可以考慮一個隊列的最大限制。

一種選擇是編寫自己的隊列狀類:
1.內部使用一個合適的容器中(即標準::隊列<>或std ::雙端隊列<>,因爲標準::隊列由defaule用途一個std :: deque的話)
2只公開你需要的功能(即構造,推(幀),POP(),大小(),...)

線程安全的,你可以考慮保護類的內部std :: mutex,類似於隊列的類方法,使用std :: lock_guard更好> <>。
一個更好的辦法是使用無鎖的容器,更復雜,無法正確地寫入,但你可以在網上找到或GitHub的一些實現。

1

解具有高FPS的記錄,使用從MATLAB支持千兆以太網和GenICam標準圖像採集工具箱。使用ROI 1000x700我會達到150fps,這是可能的與32GBRam處理器和高處理速度。通常使用8GB ram和i7處理器,我可以達到50fps。此外,爲了獲得更好的圖像質量,將曝光時間改爲1000微秒是最佳選擇。在圖像採集工具箱中,可以選擇將數據記錄在內存或磁盤中。登錄內存是更好的選擇,因爲在將數據記錄到磁盤中時停止採集後導出數據,同時寫入數據。