Как избежать выбора «Источник видео -> Источник захвата» в OpenCV 2.3.0 - Visual C ++ 2008 - PullRequest
1 голос
/ 10 ноября 2011

У меня был отлично работающий код OpenCV (с функцией cvCaptureFromCAM(0)). Но когда я изменил его для запуска в отдельном потоке, я получаю это диалоговое окно выбора «Источник видео» , и он просит меня выбрать веб-камеру. Хотя я выбираю камеру, похоже, что функция cvCaptureFromCAM(0) возвращает ноль. Я также попытался передать значения 0, -1,1, CV_CAP_ANY этой функции. У меня есть сомнения, что это диалоговое окно вызывает эту проблему. Есть ли способ избежать этого или у кого-то есть другое мнение?

Я следил за следующими сообщениями при отладке:

cvCreateCameraCapture возвращает ноль

OpenCV cvCaptureFromCAM возвращает ноль

EDIT Структура кода

//header includes
CvCapture* capture =NULL;
IplImage* frame = NULL;

int main(int argc, char** argv){

    DWORD qThreadID;
    HANDLE ocvThread = CreateThread(0,0,startOCV, NULL,0, &qThreadID);   
    initGL(argc, argv);   
    glutMainLoop(); 
    CloseHandle(ocvThread);    
    return 0;
}

void initGL(int argc, char** argv){    
    //Initialize GLUT
    //Create the window
    //etc
}

DWORD WINAPI startOCV(LPVOID vpParam){ 
    //capture = cvCaptureFromCAM(0); //0 // CV_CAP_ANY

    if ((capture = cvCaptureFromCAM(1)) == NULL){ // same as simply using assert(capture)
      cerr << "!!! ERROR: vCaptureFromCAM No camera found\n";
      return -1;
    }    
    frame = cvQueryFrame(capture);
}    
//other GL functions

Спасибо.

Ответы [ 2 ]

2 голосов
/ 10 ноября 2011

Поскольку это проблема, которая возникает только в Windows, простое решение состоит в том, чтобы оставить cvCaptureFromCAM(0) в потоке main(), а затем выполнить обработку изображений в отдельном потоке, как вы и предполагали изначально.

Просто объявите CvCapture* capture = NULL; как глобальную переменную, чтобы все ваши потоки могли получить к ней доступ.

1 голос
/ 10 ноября 2011

решаемая. Мне не удалось избавиться от вышеупомянутого диалогового окна, но я избежал ошибки, просто дублируя строку захвата = cvCaptureFromCAM (0);

capture = cvCaptureFromCAM(0);
capture = cvCaptureFromCAM(0);

Это было просто случайно. Я подозреваю, что это как-то связано с поведением Thread. Какая у тебя идея?

Спасибо всем за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...