【问题标题】:Opencv VideoCapture with multithreadOpencv VideoCapture 与多线程
【发布时间】:2015-06-02 12:50:53
【问题描述】:

我正在尝试通过将多线程与 cv::VideoCapture 和 std::thread 一起使用来显示多视频。如果我只是调用函数 work(),它就可以工作!但是当我把它放到一个线程中时,什么都没有显示。我在这里错过了什么吗?或者你有更好的办法吗?谢谢!

附言我正在使用 Mac OS X 10.10.2,Opencv 2.4.9

代码如下:

void work(std::string address, std::string window) {
    cv::VideoCapture cap(address);
    if (!cap.isOpened()) {
        std::cout << "Cannot open camera" << std::endl;
        return;
    }
    cv::Mat frame;
    while (char(cv::waitKey(1)) != 'q' && cap.isOpened()) {
        cap >> frame;
        if(frame.empty()) {
            std::cout << "Video over" << std::endl;
            break; 
        }
        cv::imshow(window, frame);
    }
}

int main(int argc, char *argv[]) {
    std::thread t1(work, "/Path/to/test.mp4", "test");
    t1.join();

    // work("/Path/to/test.mp4", "test"); // it works if just call function work()

    std::cout << "Done..." << std::endl;
}

【问题讨论】:

  • 我无法在 Windows 7 上重现您的问题;您的实际代码中是否有一行cv::namedWindow("test");?如果我在创建线程之前将它包含在主函数中,我只会得到一个灰屏并且应用程序挂起。如果有,请尝试在 work 函数中移动窗口函数,以便由执行显示和检查键盘输入的线程创建窗口。
  • 它也不起作用。我发现如果在创建线程之前包含 cv::namedWindow(),它可以只显示视频的第一帧并且应用程序挂起。但是如果我删除 cv::namedWindow(),我会得到一个灰屏并且应用程序挂起。我真的很困惑。
  • 奇怪。就documentation 而言,imshow 会自动创建窗口,因此如果您不从主函数初始化窗口并尝试从线程访问它,它应该可以工作。如果将cv::nameWindow("test");放在work函数中,是否也会产生灰屏并挂起?
  • 嗨。问有进展吗?当我尝试在 python 上创建立体摄像头查看器时,我也遇到了问题。它们在多个进程上运行良好,但在多个线程上却不行。

标签: c++ multithreading opencv


【解决方案1】:

在附加线程中使用 cv::imshow() 可能不是一个好主意。 cv::imshow() 只在主线程中运行良好。

【讨论】:

    【解决方案2】:

    旧线程,但您可能在调用cv::imshow 后错过了cv::waitKey(5);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多