2014-12-04 298 views
1

對於我正在開發的計算機視覺項目,我需要使用Logitech C920攝像頭抓取圖像。我使用OpenCV的VideoCapture來做到這一點,但是我面臨的問題是,我在某個時刻拍攝的圖像沒有顯示相機看到的最新內容。也就是說,如果我在時間戳t處拍攝一張圖像,它可以顯示相機在時間戳(t-delta)處看到的內容。抓取新攝像頭圖像時的OpenCV VideoCapture/V4L2延遲

我這樣做是通過編寫一個遞增計數器並將其顯示在屏幕上的程序來完成的。我將相機指向屏幕並進行錄製。當計數器達到某個值時,比如說10000,它會抓取一個圖像並將其保存爲文件名「counter_value.png」(例如10000.png)。這樣我就可以將計數器的當前值與攝像機看到的當前值進行比較。我注意到大多數時候延遲大約是4-5幀,但它不是一個固定值。

我看到類似的帖子關於這個問題,但沒有一個真正的幫助。有些人建議將幀抓取程序放入單獨的線程並更新「current_frame」Mat變量。我嘗試過,但由於某種原因,問題仍然存在。其他人提到,相機在Windows上運行良好(但我需要使用Linux,但)。我試着在Windows上運行相同的代碼,實際上延遲只有大約1幀(這可能是因爲屏幕沒有足夠快地更新,相機沒有看到計數器)。

然後,我決定只使用V4L2代碼運行一個簡單的攝像頭查看器,認爲這個問題可能來自OpenCV。我再次經歷了同樣的延遲,這使我相信驅動程序正在使用某種緩衝區來緩存圖像。

我是新來V4L2,我真的需要儘快解決這個問題,所以我的問題,你們是:

  1. 有沒有人發現,爲獲得使用V4L2最新的圖像解決方案(和也許是OpenCV)?
  2. 如果沒有辦法使用V4L2來解決它,那麼有沒有人知道在Linux上解決這個問題的另一種方法?

問候,

米哈伊

回答

0

看起來會有總是VideoCapture::grab()通話和框架時實際採取之間的延遲。這是因爲在硬件/ SO級別完成的幀緩衝,並且您無法避免這種情況。

OpenCV提供了VideoCapture::get(CV_CAP_PROP_POS_MEC))方法來爲您提供捕捉幀的準確時間,但只有在相機支持時纔可以。

最近,一個問題在V4L OpenCV的執行中發現: http://answers.opencv.org/question/61099/is-it-possible-to-get-frame-timestamps-for-live-streaming-video-frames-on-linux/

而且前幾天的修復已經被拉: https://github.com/Itseez/opencv/pull/3998

最後,如果你有正確的設置,你可以知道一幀的拍攝時間是多少(並因此得到補償)。

0

這可能是Linux UVC驅動程序存在的問題,但我一直在Ubuntu 12.04和14.04機器上使用Microsoft LifeCam Cinemas進行機器視覺,並且沒有看到4-5幀延遲。我在低光照條件下操作它們,但在這種情況下,它們將幀速率降低到7.5 fps。

另一個可能的罪魁禍首是網絡攝像頭中的延遲,具體取決於使用的格式。 C920似乎支持H.264(很少有網絡攝像頭可以),所以羅技可能會盡最大努力使這項工作順利進行,但OpenCV似乎不支持Linux上的H.264;請參閱answer瞭解它支持的格式。同樣的問題也有一個answer與內核hack(!)解決與UVC驅動程序的問題。

PS:要檢查在我的情況下,實際使用的格式,我在OpenCV的代碼添加

fprintf(stderr, ">>> palette: %d\n", capture->palette); 

this line