如何避免OpenCV 2.3.0中的“视频源 - >捕获源”选择 - Visual C ++ 2008

时间:2011-11-10 14:29:47

标签: visual-c++ opencv

我有一个完美的OpenCV代码(具有函数cvCaptureFromCAM(0))。但当我修改它以在一个单独的线程中运行时,我得到了这个"视频源"选择对话框,它要求我选择网络摄像头。即使我选择了一个凸轮,似乎函数cvCaptureFromCAM(0)返回null。我也尝试将值0, -1,1, CV_CAP_ANY传递给此函数。我怀疑这个对话框会导致此问题。有没有办法避免这种情况,或者有没有人有任何其他意见?

我在调试时跟踪了以下帖子:

cvCreateCameraCapture returns null

OpenCV cvCaptureFromCAM returns zero

修改 代码结构

//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 个答案:

答案 0 :(得分:2)

由于这是仅在Windows上发生的问题,因此一个简单的解决方法是将cvCaptureFromCAM(0)保留在main()线程上,然后按照您最初的意图在单独的线程上执行图像处理。

只需将CvCapture* capture = NULL;声明为全局变量,这样所有线程都可以访问它。

答案 1 :(得分:1)

解决。我无法摆脱上面提到的对话框,但我通过复制行捕获= cvCaptureFromCAM(0)来避免错误;

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

这只是随机的。我怀疑它与Thread的行为有关。你有什么想法?

感谢所有人的贡献。