c ++ opencv图像不显示在boost线程内

时间:2015-05-17 10:58:29

标签: c++ multithreading opencv boost

我正在开发c++应用程序,我使用了boostopencv。并创建boost线程并调用该线程内的函数。函数有opencv imread(我使用cvLoadimage检查但是我得到了相同的结果)但是程序无法完成并且程序退出。

请在下面找到我使用的代码

boost::thread *thread_reconstruct; 

    int main( int argc, const char** argv )
    {

        thread_reconstruct = new boost::thread(  &FuncCreate  );

        return 0;

    }

    void FuncCreate()
    {
        while (true)
        {
          compute_left_descriptors(g_nameRootFolder.c_str());
    }

    }

    void compute_left_descriptors(const char* name_dir)
    {

        char namebuf[1024];


            sprintf(namebuf, "%s/Left/%04d_left.bmp", name_dir, 1);

        // Program ended with exit code: 0 programe exit from here.
        Mat input_left = imread(namebuf, CV_LOAD_IMAGE_COLOR);

        imshow("Right View", input_left);
        waitKey(0);

        printf("done\n");
    }

1 个答案:

答案 0 :(得分:1)

请尝试使用此版本的代码并告诉我们它是否有效

boost::thread *thread_reconstruct; 

int main( int argc, const char** argv )
{

    cv::namedWindow("Right View"); // this will create a window. Sometimes new windows can't be created in another thread, so we do it here in the main function.

    thread_reconstruct = new boost::thread(  &FuncCreate  );

    thread_reconstruct->join(); // this will make your program wait here until the thread has finished processing. Otherwise your program would exit directly.

    return 0;

}

void FuncCreate()
{
    while (true)
    {
      compute_left_descriptors(g_nameRootFolder.c_str());
    }
}

void compute_left_descriptors(const char* name_dir)
{

    char namebuf[1024];


        sprintf(namebuf, "%s/Left/%04d_left.bmp", name_dir, 1);

    // Program ended with exit code: 0 programe exit from here.
    Mat input_left = imread(namebuf, CV_LOAD_IMAGE_COLOR);

    if(input_left.empty()) printf("could not load image\n");

    imshow("Right View", input_left);
    waitKey(0); // if you dont want to press a key before each new image, you can change this to waitKey(30);

    printf("done\n");
}