我有一个完美的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
感谢。
答案 0 :(得分:2)
由于这是仅在Windows上发生的问题,因此一个简单的解决方法是将cvCaptureFromCAM(0)
保留在main()
线程上,然后按照您最初的意图在单独的线程上执行图像处理。
只需将CvCapture* capture = NULL;
声明为全局变量,这样所有线程都可以访问它。
答案 1 :(得分:1)
解决。我无法摆脱上面提到的对话框,但我通过复制行捕获= cvCaptureFromCAM(0)来避免错误;
capture = cvCaptureFromCAM(0);
capture = cvCaptureFromCAM(0);
这只是随机的。我怀疑它与Thread的行为有关。你有什么想法?
感谢所有人的贡献。