该程序应该允许用户在图片上绘制几秒钟(如预处理),之后对图片进行一些处理并进行绘制。
我创建后台线程暂停处理一段时间。用户应该能够在那个时间画画。
正在处理while
循环。
变量running
显示处理是否处于活动状态或用户是否可以绘制。
但是在代码中我编写了后台线程块UI线程,但据我所知,它们并没有交互。
这似乎std::this_thread::sleep_for
会阻止所有线程,但文档说它只会阻塞其线程。我不知道这意味着什么。
如何不阻止来自当前线程的所有线程?
更新:这是来自交互式图片细分的MCVE。 程序在后台处理图像并在GUI中显示。 但在处理开始之前,我希望用户能够点击GUI来帮助算法。
当预处理运行时(没有后台,用户可以点击,它将绘制),GUI停止并等待处理开始(直到后台线程结束)。
#include <thread>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
bool running;
cv::Mat image;
void onMouse(int event, int x, int y, int flags, void*)
{
running = false;
if (event == cv::EVENT_LBUTTONDOWN)
{
cv::circle(image, cv::Point(x, y), 20, cv::Vec3b(0, 0, 255), CV_FILLED);
cv::imshow("window", image);
cv::waitKey(1);
}
running = true;
}
int main()
{
running = false;
image = cv::Mat(400, 400, CV_8UC3, cv::Scalar(0, 255, 0));
cv::namedWindow("window", cv::WINDOW_AUTOSIZE);
cv::imshow("window", image);
cv::waitKey(1);
cv::setMouseCallback("window", onMouse);
std::thread task = std::thread([]()
{
std::this_thread::sleep_for(std::chrono::seconds(2));
running = true;
});
while (true)
{
if (running)
{
cv::imshow("window", image);
cv::waitKey(1);
}
}
task.join();
return 0;
}