C++ 使用cvQueryFrame和boost::线程
我需要调用cvQueryFrame从opencv的网络摄像头中捕获一个帧,而不是使用boost创建的线程。下面是一个小示例代码:C++ 使用cvQueryFrame和boost::线程,c++,multithreading,boost,opencv,C++,Multithreading,Boost,Opencv,我需要调用cvQueryFrame从opencv的网络摄像头中捕获一个帧,而不是使用boost创建的线程。下面是一个小示例代码: void testCVfunc(){ IplImage* frame; CvCapture *capture; capture = cvCreateCameraCapture(CV_CAP_ANY); if(!capture){ exit(1); } frame = cvQueryFrame(captur
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;
}
正如评论所说,如果我不是从boost::thread调用testCVfunc,它就完成了它的工作,但是如果我使用boost::thread,我会得到一个黑屏。
我不明白,也许有人明白
感谢您的帮助。当从辅助线程执行OpenCV时,我看到了一些问题,当行为在所有平台上都不一致时,很难找出问题的根源 例如,您的源代码在Mac OS X 10.7.2上与OpenCV 2.3.0完美配合。我不知道您使用的是什么平台,但它在我的计算机上工作的事实表明OpenCV在您使用的平台上存在一些实现问题
现在,如果您无法将OpenCV的代码移动到主线程,那么您可能需要开始考虑创建第二个程序来处理所有与OpenCV相关的任务,并使用某种IPC机制来允许此程序与主应用程序通信。我通过调用
cvCreateCameraCapture(CV_CAP_ANY);
在主线程中,即使它没有真正回答问题:
为什么这不起作用?问题
希望这能帮助其他人。尝试调用cv::startWindowThread;在主应用程序中,然后在线程中创建一个窗口。这对我很有效。cvNamedWindow不是问题所在,我特别尝试从另一个线程运行OpenCV,因此您的第二个建议并不能真正帮助我的完整程序使用另一个必须从另一个线程执行的库。不管怎样,还是谢谢你,也许还有别的想法?为什么openCV不负责线程?那是什么系统?赢Linux?雨衣?您使用的是什么opencv版本?对不起,忘记说这些基本信息了。我在Windows 7上,使用opencv 2.3。更新了我的答案。我只能走这么远了。祝你好运我在主线程中创建窗口的建议来自。还有这个评论:唯一棘手的事情是OpenCV希望“imshow”出现在主线程上。这是我从试验和错误中学到的经验。人们发现OpenCV在多个平台的次线程上运行时存在一些问题。