imshow()函数冻结

时间:2014-08-19 03:17:57

标签: c++ opencv

我正在使用openCV开发一些视频分析算法。但是,在我处理一个帧并希望在窗口上显示它之后,它会挂起在imshow()函数中。我在网上搜索过这个问题,但仍然找不到问题!这是我使用多线程和openCV的代码:

void CFeatureExtraction::extract(){
    boost::thread OpFlowThread, BGSThread;
    while (m_nRun){
        ImgPtr frame_ptr;
        m_pQueue->wait_and_pop(frame_ptr);
        Mat frame1, frame2; 
        (*frame_ptr).copyTo(frame1);
        (*frame_ptr).copyTo(frame2);

        OpFlowThread = boost::thread(&COpFlow::op_flow, m_pAlgo,frame1);
        BGSThread = boost::thread(&CBGSub::bgsub, m_pBGS, frame2);
        OpFlowThread.join();
        BGSThread.join();
    }
}

在op_flow和bgsub函数中,我一起使用imshow()和cvWaitKey()!但它一直在悬挂整个计划。 如果我的问题仍然不明确,请随时向我询问更多细节。 以下是调用imshow()的详细代码:

CFarnebackAlgo::CFarnebackAlgo() : COpFlow()
{
    namedWindow("Optical Flow");
}

CFarnebackAlgo::~CFarnebackAlgo()
{
    destroyWindow("Optical Flow");
}

int CFarnebackAlgo::op_flow(Mat frame)
{
   Mat flow;
   cvtColor(frame, gray, COLOR_BGR2GRAY);
   if (prevgray.data)
   {
       calcOpticalFlowFarneback(prevgray, gray, flow, 0.5, 3, 15, 3, 5, 1.2, 0);

       for (int y = 0; y < frame.rows; y += 8)
           for (int x = 0; x < frame.cols; x += 8){
           const Point2f& fxy = flow.at<Point2f>(y, x);
           line(frame, Point(x, y), Point(cvRound(x + fxy.x), cvRound(y + fxy.y)),    Scalar(0, 255, 0));
           circle(frame, Point(x, y), 2, Scalar(0, 255, 0), -1);
           }
       if (frame.data == NULL){
           cout << "No Img!" << endl;
           exit(0);
       }
       imshow("Optical Flow", frame);
       waitKey(50);
   }
   std::swap(prevgray, gray);
   return 0;
}

如果我将namedWindow()放在op_flow()中,它就可以了。但是,如果我把它放在构造函数中,它就不会工作并冻结。谁知道为什么?

0 个答案:

没有答案