2011-04-12 249 views
0

嘿傢伙, 我正在使用OpenCV與C++ API,爲了使我的項目更可靠,我需要特定的攝像頭連接\斷開連接處理。 我已經搜索了指導方針,但我只能找到需要一個醜陋的黑客才能這樣做的答案。攝像頭連接和斷開連接捕獲

你可以建議一個更乾淨的方法來做到這一點嗎?

日Thnx

+1

[檢測的拔出捕獲裝置(OpenCV的)](http://stackoverflow.com/questions/4028463/detecting-an-unplugged-capture-device-opencv)的可能重複 – karlphillip 2011-04-12 17:17:58

回答

0

檢測相機連接/斷開可能需要一些技巧。

我建議您在應用程序運行時啓動另一個線程,以便在循環中檢查cvCreateCameraCapture()的成功。

類似以下內容:

while (run_detection_thread) // global variable controlled by the main thread 
{ 
    CvCapture* capture = cvCreateCameraCapture(-1); //-1 or whatever number works for you 
    if (camera) //camera is connected 
    { 
    sleep(1); 
    } 
    else 
    { 
    // camera was disconnected   
    } 
} 
+0

我看到這個溶液已經,但每隔幾秒鐘運行另一個線程似乎浪費時間。我開發了一個實時系統,這可能會造成不必要的延誤 – 2011-04-14 16:33:57

+0

不幸的是沒有其他辦法。 – karlphillip 2011-04-14 23:16:27

+0

@Royi順便說一句,這個想法是有一個額外的線程運行整個時間,並在裏面會有這個循環來檢查相機是否仍然連接。這不像你每秒爲每次檢查創建一個新線程。除非你使用300MHz的CPU,否則這是一個非常實用的解決方案。 – karlphillip 2011-04-16 12:57:41

0

我認爲我對這個問題的一個很好的解決方法。我創建了一個輔助矩陣數組,它具有與攝像機輸出相同的分辨率。我將它分配給剛剛分配從相機捕獲的幀的Mat數組,最後我檢查了這個數組的規範。如果它等於零,則表示沒有從相機捕獲新幀。

VideoCapture cap(0); 
if(!cap.isOpened()) return -1; 

Mat frame; 
cap >> frame; 
Mat emptyFrame = Mat::zeros(CV_CAP_PROP_FRAME_WIDTH, CV_CAP_PROP_FRAME_HEIGHT, CV_32F); 

for(;;) 
{ 
    frame = emptyFrame; 
    cap >> frame; 
    if (norm(frame) == 0) break; 
}