cv :: imshow在不同线程上时不显示cv :: mat颜色

马力诺斯

这是我用来在不同线程上生成一些内容的HighGui窗口的类。

class Capture {
private:
  bool running;
  std::thread thread;
  cv::Mat background;
  void loop() {
    while (running) {
      cv::imshow("sth",background);
      cv::waitKey(settings::capture_wait_time);
    }
  }
  public:
   Capture()  :
     running {false},
     thread {},
     background { 800, 800,  CV_8UC3, cv::Scalar{255,0,255}} {
       cv::namedWindow("sth");  
   }
   inline ~Capture() {
     if (running) stop(); // stop and join the thread
     cv::destroyWindow("sth");
   }
   void run() {
     if (!running) {
       running = true;
       thread = std::thread{[this]{loop();}};
     }
   }
   inline void join() { if (thread.joinable()) thread.join(); };
   inline void stop() {
     running = false;
     if (thread.joinable()) thread.join();
   }
};

// main
Capture cap;
cap.run();
// ... 

问题在于该窗口将始终最终变为黑色(在这种情况下,该窗口应为紫色)。我显然在这里错过了一些东西。

三木

看来您无法在另一个线程中创建窗口。同样,在另一个线程上调用成员函数的方式似乎是错误的。

看一下这段代码。它显示的图像在不同的线程中每秒变化一次,并在5秒钟后返回。

#include <opencv2/opencv.hpp>
#include <thread>

using namespace std;
using namespace cv;

class Capture {
private:
    bool running;
    std::thread thread;
    cv::Mat background;
    void loop() {

        while (running) {
            cv::imshow("sth", background);
            cv::waitKey(1000);

            Scalar color(rand()&255, rand()&255, rand()&255);
            background.setTo(color);
        }
    }
public:
    Capture() :
        running{ false },
        thread{},
        background{ 800, 800, CV_8UC3, cv::Scalar{ 255, 0, 255 } } {
    }
    inline ~Capture() {
        if (running) stop(); // stop and join the thread
    }
    void run() {
        if (!running) {
            running = true;
            thread = std::thread{ &Capture::loop, this };
        }
    }
    inline void join() { if (thread.joinable()) thread.join(); };
    inline void stop() {
        running = false;
        if (thread.joinable()) {
            thread.join();
        }
    }
};

int main()
{
    Capture cap;
    cap.run();

    std::this_thread::sleep_for(std::chrono::milliseconds(5000));

    cap.stop();

    return 0;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++ | 使用setTo更改cv :: mat中的颜色

来自分类Dev

openCV cv :: mat版本

来自分类Dev

读取数据cv :: Mat

来自分类Dev

比较2 cv :: Mat

来自分类Dev

断言失败 CV_Assert( CV_IS_MAT(objectPoints) && CV_IS_MAT(imagePoints) && CV_IS_MAT(A) && CV_IS_MAT(rvec) && CV_IS_MAT(tvec) )

来自分类Dev

无法从'cv :: Mat *'转换为'const cv :: Mat'

来自分类Dev

如何在vector <cv :: Mat>中找到相同的cv :: Mat

来自分类Dev

查找cv :: Mat的字节大小

来自分类Dev

cv :: Mat每个元素逆

来自分类Dev

打开CV Mat结构坐标

来自分类Dev

OpenCV 2.4:在MFC中显示cv :: Mat

来自分类Dev

OpenCV 2.4:在MFC中显示cv :: Mat

来自分类Dev

Cv :: Mat CvType返回时更改

来自分类Dev

从 UIImage 创建 cv::Mat 时出错

来自分类Dev

cv :: Mat和arma :: mat之间的转换

来自分类Dev

从cv :: Mat转换为arma :: mat

来自分类Dev

无法从'cv :: Scalar_ <double>'转换为'cv :: Mat'

来自分类Dev

使用cv :: imdecode后,cv :: Mat外部数据未修改

来自分类Dev

比cv :: putText()更好的向ca cv :: Mat添加文本的方法?

来自分类Dev

如何将 cv::Scalar 分配给 cv::Mat?

来自分类Dev

c ++将cv :: Mat从CV_8U转换为CV_32F

来自分类Dev

如何从CVPixelBufferRef转换为openCV cv :: Mat

来自分类Dev

C ++ / OpenCV-如何重塑cv :: Mat?

来自分类Dev

将vtkImageData复制到cv :: Mat

来自分类Dev

如何在C ++中翻转cv :: mat?

来自分类Dev

cv :: Mat的deallocate方法有什么作用?

来自分类Dev

将cv :: Mat转换为MTLTexture

来自分类Dev

OpenCV使用步长从数组生成cv :: Mat

来自分类Dev

将cv :: Mat转换为ipcMatrix <ipcRGB>