2013-10-04 3 views
1

Я пытаюсь захватить фреймы из iSight Macbook Pro с использованием OpenCV 2.4.6 и построен с использованием компилятора Apple LLVM 4.2 на Xcode.Захват с Macbook Pro iSight с Opencv

Однако я не получаю никаких фреймов. Обычно я настраиваю цикл while, пока он не будет заполнен, но один из них работает в течение ~ 30 секунд без результата. Как я могу отладить это?

void testColourCapture() { 

    cv::VideoCapture capture = cv::VideoCapture(0); //open default camera 
    if(!capture.isOpened()) { 
     fprintf(stderr, "ERROR: ColourInput capture is NULL \n"); 
    } 
    cv::Mat capFrame; 

    int frameWaits = 0; 
    while (capFrame.empty()) { 
     capture.read(capFrame); 
     //capture >> capFrame; 
     cvWaitKey(30); 
     frameWaits++; 
     std::cout << "capture >> capFrame " << frameWaits << "\n"; 
     if (frameWaits > 1000) { 
      break; 
     } 
    } 
    imshow("capFrame", capFrame); 

} 

Я обеспечил его не многопоточным. Кроме того, capture.isOpened всегда возвращает true.

EDIT: Похоже, другие имели эту проблему: OpenCV wont' capture from MacBook Pro iSight

EDIT: Моя процедура установки OpenCV была:

$ Sudo порт Selfupdate

$ Sudo порт установить OpenCV

Тогда , Я перетащил libopencv_core.dylib, libopencv_highgui.dylib, libopencv_imgproc.dylib и libopencv_video.dylib в папку Frameworks моего проекта Xcode, из/opt/local/lib

+0

Какой выход вы ожидаете? Вы проверяли, не является ли 'capFrame.data'' 'NULL'? Кроме того, сколько итераций проходит цикл? Как написано, ваш код только петли один раз, если изображение заполнено. – Aurelius

+0

Я проверяю 'capFrame.empty()', который никогда не становится истинным. Цикл продолжается до тех пор, пока frameWaits = 1000, а затем не сломается. – escapecharacter

ответ

2

Я получил это работает с помощью следующего кода:

VideoCapture cap = VideoCapture(0); // open the video file for reading 

if (!cap.isOpened()) // if not success, exit program 
{ 
    cout << "Cannot open the video file" << endl; 
    return -1; 
} 

//cap.set(CV_CAP_PROP_POS_MSEC, 300); //start the video at 300ms 

double fps = cap.get(CV_CAP_PROP_FPS); //get the frames per seconds of the video 

cout << "Frame per seconds : " << fps << endl; 

namedWindow("MyVideo",CV_WINDOW_AUTOSIZE); //create a window called "MyVideo" 

while(1) 
{ 
    Mat frame; 

    bool bSuccess = cap.read(frame); // read a new frame from video 

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

    imshow("MyVideo", frame); //show the frame in "MyVideo" window 

    if(waitKey(30) == 27) //wait for 'esc' key press for 30 ms. If 'esc' key is pressed, break loop 
    { 
     cout << "esc key is pressed by user" << endl; 
     break; 
    } 
} 
+0

Этот код (функционально) такой же, как и нерабочий код оригинального плаката. Возможно, вы использовали другую версию OpenCV? –

Смежные вопросы