2014-11-14 366 views
-2

我有兩個線程和兩個線程:一個在我的GUI中顯示攝像頭幀,一個在同一個攝像頭上錄製視頻。 我在每個班級中使用不同的cv::VideoCapture來訪問我的攝像頭。我的MainWindow和Recorder類的兩個構造器都有theWebcam.open(INDEX)行來打開攝像頭。我的問題是,當程序嘗試打開第二個cv::VideoCapture對象時,大約50%的時間開始崩潰。我如何在兩個班級中使用相同的攝像頭?cv :: VideoCapture:從兩個線程訪問相同的攝像頭

回答

0

據我所知這是不可能的(但從來沒有自己試過)。我更喜歡以下方法:

一個線程與攝像機「通信」,即抓取圖像,並將一個副本發送到線程寫入文件,並將一個副本發送到GUI以顯示實時圖像。此外,只要相機不支持多播(假設它是一臺ip-camera),幀速率很可能會下降。

+0

我正在使用USB網絡攝像機。我不明白爲什麼它不可能。如果我將Detector註釋掉並讓MainWindow顯示來自網絡攝像頭的視頻源,我可以運行該程序的10個實例,並且它們都將顯示來自同一個攝像頭的相同視頻,而不會有任何問題。如果顯然可以多次訪問網絡攝像機,爲什麼不能在同一個程序中使用同一個網絡攝像頭兩次? – testus 2014-11-14 16:22:16

+0

取決於OpenCV如何照顧相機手柄。我知道其他庫在內部存儲句柄列表並僅保留每個句柄的「實例」,因此當從不同線程訪問時會導致問題/訪問衝突等。但我認爲你應該考慮我的建議,只使用一個攝像頭連接並分發所拍攝圖像的副本...... – Robert 2014-11-14 16:26:23

1

我已經用羅伯特所描述的技術取得了成功。我使用指針將圖像傳遞到不同的線程,並讓主線程創建我需要的所有VideoCapture對象以及namedWindow對象。我現在說的是我的專業領域之外,但我的經驗表明,除了主線程之外,不能在任何線程中創建來自OpenCV的VideoCapture和namedWindow對象,而必須轉到輔助線程中。