cv::imshow 在不同线程上不显示 cv::mat 颜色 [英] cv::imshow does not display cv::mat color when on different thread
本文介绍了cv::imshow 在不同线程上不显示 cv::mat 颜色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
这是我用来在不同线程上生成包含一些内容的 HighGui 窗口的类.
This is a class I use to spawn a HighGui window with some content on different thread.
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();
// ...
问题是窗口最终总是黑色的(在这种情况下它应该是紫色的).我显然在这里遗漏了一些东西......
The problem is that the window will always end up being black (in this case it should be purple). I am obviously missing something here....
推荐答案
似乎无法在另一个线程中创建窗口.此外,您在另一个线程上调用成员函数的方式似乎是错误的.
It seems that you cannot create a window in another thread. Also, the way you're calling the member function on the other thread seems wrong.
看看这段代码.它在不同的线程中显示每秒变化的图像,并在 5 秒后返回.
Have a look at this code. It displays an image that change every second in a different thread, and returns after 5 seconds.
#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;
}
这篇关于cv::imshow 在不同线程上不显示 cv::mat 颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文