2014-02-10 45 views
0

在OpenCV中 - 當使用USB網絡攝像頭初始化一個VideoCapture對象時,每2或3次運行一次,相機將無法初始化。我有這個令人難以置信的醜陋的代碼來解決這個問題,但也許有人知道可能導致相機初始化失敗的原因以及如何防止它?OpenCV中的攝像機初始化失敗

// Initialize video capture 
camera_ = cv::VideoCapture(1); 
camera_.set(CV_CAP_PROP_CONVERT_RGB , false); 

camera_ >> frame_full_; 
while (frame_full_.empty()){ // Could be !cap.isOpened 
    cerr << "Camera failure." << endl; 
    camera_.release(); 
    camera_ = cv::VideoCapture(1); 
    camera_.set(CV_CAP_PROP_CONVERT_RGB , false); 
    camera_ >> frame_full_; 
} 

/// Do something with the camera feed. 

當我關閉程序時,我得到在控制檯Cleaned up camera.,所以我想它被釋放正確。

新增信息:在其中利用相機無法初始化,調用>>/.read()的運行需要很長的恢復。

編輯:沒有使用>>運營商和.read(),如@ 4nonymou5建議之間沒有什麼區別。

回答

0

如果您的意思是,您需要使用攝像頭進行視頻輸入,並且希望對各個幀進行一些處理,以下代碼可能對您有所幫助。

#include "opencv2/highgui/highgui.hpp" 
#include <iostream> 

using namespace cv; 
using namespace std 
int main(int argc, char *argv[]) 
{ 
    VideoCapture cap(1); 
if (!cap.isOpened()) // if not success, exit program 
{ 
    cout << "Cannot access camera" << endl; 
    return -1; 
} 
namedWindow("cam",1); 
while(true) 
     { 
     Mat frame; 
     bool check = cap.read(frame); // read a new frame from video 

     if (!check) //if not success, break loop 
     { 
        cout << "Cannot read the frame from video file" << endl; 
        break; 
     } 

// do what ever processing you want to do on frame 

     imShow("cam", frame); 
     waitKey(33); 
    } 
return 0; 
} 

併爲您的代碼來響應, 只是while循環,它會工作前加

camera_.read(frame_full_); 

+0

感謝您的回答。我沒有問題得到相機飼料和使用它;這只是偶爾,相機無法初始化,因爲沒有明顯的原因,即你的線'cap.isOpened()'會失敗;這就是爲什麼我有醜陋的while循環。我想知道爲什麼相機會間歇性地失效。 – noio

+0

是的,我有一個類似的問題,當我改變opencv的版本的時候回來,但是,它不是攝像頭的初始化,但是,在訪問幀。 「camera_ >> frame_full_;」 這是爲我返回一個空框架,所以我補充說,「camera_.read(frame_full_);」 到線,它的工作。 因此,只要檢查問題是否相同,即使我想聽到其他人的正確答案。 – 4nonymou5