c++ - 在多线程应用程序中使用 opencv waitKey()

标签 c++ multithreading qt opencv openni

我有一个用 C++ 和 Qt5.7 和 OpenNI 编写的多线程应用程序。它有一个启动第二个线程的主线程,该线程从 .oni 记录文件(asus xtion pro live)捕获帧进行一些处理,并通过 Qt 信号槽机制将帧传递给主线程,主线程使用 imshow()。 我想要做的是实现一个暂停键,例如按下“p”处理暂停。我在想这样的事情:

void Camera::run(){
  while(!cameraStop && this->device.isValid())
    {
      try {
        if (!buttonPause) {
            getFrame();
            process();
            emit sigFrameImageReady(frame);
            if (cv::waitKey(1)==112){
              setButtonPause(!(getButtonPause()));
            }
          }

      }
      catch(std::exception &ex) {
        std::cerr << "getFrame()" << ex.what() << std::endl;
      }
    }
}

这样是行不通的,我想那是因为frame是由另一个线程(主线程)显示的,这里的waitKey()只是阻塞了整个过程,但是如果我将它放在主线程中,就在 imshow() 之后:

void Process::FrameImageReady(cv::Mat FrameImage)
{
  if (modedebug)
    cv::imshow("bgr", FrameImage);
  if (cv::waitKey(1)==112){
    cam->setButtonPause(!(getButtonPause()));
  }
} 

waitkey 似乎被忽略了(图像显示工作正常)..有什么想法吗?

编辑 GUI 部分仅用于调试目的。

最佳答案

您应该在显示线程中实现线程安全的 FIFO 缓冲区或循环缓冲区。来自相机线程的信号会将图像推送到此缓冲区,而显示线程会将它们取出并在单独的循环中显示它们。只有这样,您才能将相机事件循环与显示线程分开。

关于c++ - 在多线程应用程序中使用 opencv waitKey(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39700877/

相关文章:

c++ - 使用 scanf 和 printf 会使程序无限循环,但通过替换 cin 和 cout 可以正常工作

Java 监视器代替二进制信号量

linux - 在 Gnome 3、Xfce 和 Unity 下使用 Qt,带有子窗口的全屏窗口不会停留在顶部

image - 如何在 QML 中添加和使用资源?

c++ - 是否有用于 Boost::asio 的 Web 框架?

c++ - 没有匹配函数调用 ‘X::X()’

c++ - 使用 QT5_ADD_RESOURCES 和使用 CMake 进行多线程编译时损坏的资源 .cpp 文件

c++ - 使用 multimap 的多线程

c++ - 'std::thread' 的初始化没有匹配的构造函数

c++ - Qt:窗口周围的阴影