一起使用cvQueryFrame和boost :: thread

时间:2012-02-20 16:04:31

标签: c++ multithreading boost opencv

我需要调用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,我会看到黑屏。 我没有遇到问题,也许有人在做什么?

感谢您的帮助。

3 个答案:

答案 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();在主应用程序中,然后在您的线程中创建一个窗口。这对我有用。