对于我的最新项目,我在OpenCV和Kinect SDK的帮助下创建了一个远程控制应用程序。
只有当我从主线程(gui线程)调用cvCaptureFromCAM方法时它才起作用。如果我从另一个线程调用此方法,它每次都返回null。
我尝试过常见的解决方案,用参数-1或CV_CAP_ANY调用cvCaptureFromCAM - 它也返回null。
void Tracker::Start()
{
//more code
_beginthread(Tracker::StartCapture, 0, NULL);
}
void Tracker::StartCapture(void *dummy)
{
CvCapture* capture = cvCaptureFromCAM(1);
cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, CAPTURE_WIDTH );
cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, CAPTURE_HEIGHT);
cvSetCaptureProperty( capture, CV_CAP_PROP_FPS, 25);
// It takes about 2 seconds before capture can get frames from camera
// Also we must check if the camera is connected or not
while(capture == NULL)
{
if(_captureRetriesCount > 10) {
_endthread();
return;
}
Sleep(500);
capture = cvCaptureFromCAM( CV_CAP_ANY );
_captureRetriesCount++;
}
//more code
我知道cvCaptureFromCAM不是线程安全的。我创建了一个互斥锁来锁定访问权限,但它再次返回null。我还尝试使用Windows Api中的_beginthread,_beginthreadex和CreateThread创建线程。结果相同。
OpenCv版本是2.1。
从主线程调用 (http://s11.postimg.org/fges42441/working.png)
从另一个线程调用 (http://s8.postimg.org/5dwd2ewhf/wrong.png)
我希望我已经足够清楚了,我到处寻找答案,但我还没有找到答案。