我需要调用cvQueryFrame
(使用opencv从网络摄像头捕获帧)而不是使用boost创建的线程。这是一个小例子代码:
void testCVfunc(){
IplImage* frame;
CvCapture *capture;
capture = cvCreateCameraCapture(CV_CAP_ANY);
if(!capture){
exit(1);
}
frame = cvQueryFrame(capture);
cvNamedWindow("testCV", 1);
while(frame = cvQueryFrame(capture)){
if(!frame){
exit(2);
}
cvShowImage("testCV", frame);
cvWaitKey(1);
}
cvReleaseImage(&frame);
cvReleaseCapture(&capture);
}
int main(){
//Method 1: without boost::thread, works fine
testCVfunc();
//Method 2: with boost::thread, show black screen
char entree;
boost::thread threadTestCV = boost::thread(&testCVfunc);
std::cin >> entree;
}
正如评论所说,testCVfunc
如果我不是从boost::thread
调用它,它就会起作用,但如果我使用boost::thread
,我会看到黑屏。
我没有遇到问题,也许有人在做什么?
感谢您的帮助。
答案 0 :(得分:0)
我从一个辅助线程执行OpenCV时遇到了一些问题,当所有平台上的行为不一致时,很难确定问题的根源。
例如,您的源代码与Mac OS X 10.7.2上的OpenCV 2.3.0完美配合。我不知道你使用的是什么平台,但它在我的计算机上运行的事实表明OpenCV在你正在使用的平台上存在一些实现问题。
现在,如果你不能将OpenCV的代码移动到主线程,那么你可能想开始考虑创建第二个程序来处理所有与OpenCV相关的任务,并使用某种IPC机制来允许这个程序进行通信与您的主要应用程序。
答案 1 :(得分:0)
我通过调用
解决了这个问题cvCreateCameraCapture(CV_CAP_ANY);
在主线程中,即使它没有真正回答这个问题:
为什么这不起作用?问题
希望这可以帮助别人。
答案 2 :(得分:0)
尝试调用cv :: startWindowThread();在主应用程序中,然后在您的线程中创建一个窗口。这对我有用。