2010-10-15 3 views
2

Я использую машину Mac OS X 10.6. У меня есть OpenCV 2.1 x64, скомпилированный из исходного кода с помощью Xcode и его компилятора GCC.OpenCV C++ Video Capture не работает

У меня возникли проблемы с использованием функций чтения видео C++ для OpenCV. Вот простой тест код, я использую (пришел прямо из OpenCV документации):

#include "cv.h" 
#include "highgui.h" 

using namespace cv; 

int main(int, char**) 
{ 
    VideoCapture cap(0); // open the default camera 
    if(!cap.isOpened()) // check if we succeeded 
     return -1; 

    Mat edges; 
    namedWindow("edges",1); 
    for(;;) 
    { 
     Mat frame; 
     cap >> frame; // get a new frame from camera 
     cvtColor(frame, edges, CV_BGR2GRAY); 
     GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); 
     Canny(edges, edges, 0, 30, 3); 
     imshow("edges", edges); 
     if(waitKey(200) >= 0) break; 
    } 
    // the camera will be deinitialized automatically in VideoCapture destructor 
    return 0; 
} 

Программа компилируется нормально, но когда я пытаюсь запустить его, я вижу зеленый свет на моей веб-камеры загораются на несколько секунд, после чего программа завершает работу с сообщением об ошибке:

OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat, file /Users/mark/Downloads/OpenCV-2.1.0/src/cxcore/cxarray.cpp, line 2476 
terminate called after throwing an instance of 'cv::Exception' 
    what(): /Users/mark/Downloads/OpenCV-2.1.0/src/cxcore/cxarray.cpp:2476: error: (-206) Unrecognized or unsupported array type in function cvGetMat 

в режиме отладки, матрица по-прежнему кажется пустым после линии рамки колпачок >>.

Я получаю подобное поведение при попытке захвата из видеофайла или изображения, поэтому это не камера. Как вы думаете, что не так? Что я могу сделать, чтобы сделать эту работу?

EDIT: Я хотел бы добавить, что если я использую функции C, все будет хорошо. Но я хотел бы придерживаться C++, если можно.

Благодаря

ответ

1

Попробуйте упростить программу, так что вы можете определить точное местонахождение проблемы, например, изменить цикл так, что это выглядит следующим образом:

for(;;) 
{ 
    Mat frame; 
    cap >> frame; // get a new frame from camera 
// cvtColor(frame, edges, CV_BGR2GRAY); 
// GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); 
// Canny(edges, edges, 0, 30, 3); 
// imshow("edges", edges); 
    imshow("edges", frame); 
    if(waitKey(200) >= 0) break; 
} 

Если это хорошо работает, то попробуйте добавить обработку вызовов обратно, один в то время, например,

for(;;) 
{ 
    Mat frame; 
    cap >> frame; // get a new frame from camera 
    cvtColor(frame, edges, CV_BGR2GRAY); 
// GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); 
// Canny(edges, edges, 0, 30, 3); 
    imshow("edges", edges); 
    if(waitKey(200) >= 0) break; 
} 

и так далее ...

Как только вы определили проблемную линию, вы можете сосредоточиться на этом и исследовать дальше.

+0

Я сузил проблему, крышка >> рамка, похоже, не захватывает рамку в матрицу. матрица остается пустой после шапки >> frame – amatsukawa

1

Перейти к project->project properties->configuration properties->linker->input

В дополнительных зависимости наклеить cv210.lib cvaux210.lib cxcore210.lib highgui210.lib

3

Я видел ту же самую проблему. Когда я использую функции C, иногда возникает аналогичный вопрос. Из сообщения об ошибке кода C, я думаю, это произошло потому, что у камеры был NULL-кадр. Поэтому я думаю, что это можно решить следующим образом:

do 
{ 
    capture>>frame; 
}while(frame.empty()); 

Таким образом, он работает на моей машине.

1

Привет Я получил решение для вас :)

VideoCapture san_cap(0); 
if (san_cap.isOpened()) { 
    while (1) { 



     san_cap.read(san); 

     imshow("Video", san); 

     Mat frame; 
     san_cap.read(frame);  // get a new frame from camera 
     cvtColor(frame, edges, CV_BGR2GRAY); 

     imshow("Video2", edges); 



     int key = cv::waitKey(waitKeyValue); 

     if (key == 27) { 
      break; 
     } 
    } 
} 
2

я столкнулся с той же проблемой, что кажется, что первые две попытки, чтобы получить видео не возвратит никакого сигнала, так что если вы пытаетесь использовать его вам «Я получу ошибку, вот как я обошел это, просто добавив счетчик и проверив размер видео.

int cameraNumber = 0; 
if (argc > 1) 
    cameraNumber = atoi(argv[1]); 

cv::VideoCapture camera; 
camera.open(cameraNumber); 
if (!camera.isOpened()) { 
    cerr << "ERROR: Could not access the camera or video!" << endl; 
    exit(1); 
} 

//give the camera 40 frames attempt to get the camera object, 
//if it fails after X (40) attemts the app will terminatet, 
//till then it will display 'Accessing camera' note; 

int CAMERA_CHECK_ITERATIONS = 40; 
while (true) { 

    Mat cameraFrame; 
    camera >> cameraFrame; 
    if (cameraFrame.total() > 0) { 
     Mat displayFrame(cameraFrame.size(), CV_8UC3); 
     doSomething(cameraFrame, displayFrame); 
     imshow("Image", displayFrame); 
    } else { 
     cout << "::: Accessing camera :::" << endl; 
     if (CAMERA_CHECK_ITERATIONS > 0) CAMERA_CHECK_ITERATIONS--; 
     if (CAMERA_CHECK_ITERATIONS < 0) break; 
    } 


    int key = waitKey(200); 
    if (key == 27) break; 

}