在做摄像头拍摄视频时,用OpenCv外开一个线程用于显示摄像头捕获到的图像时,发现线程关闭之后再次打开线程,没有办法再次显示图像
开线程部分的代码如下,主线程通过控制ctr来控制线程关闭。
VideoCapture cap(0);
Mat frame;
std::thread cap_th(
[&ptr_camera]()
{
ctr = true;
while (ctr)
{
cap >> frame;
imshow("show", frame);
cv::waitKey(30);
}
}
);
cap_th.detach();
可能的原因是线程结束之后OpenCv自动回收窗口机制的某些因素导致下一次新建一个同名的窗口会失败,从而无法显示图像。
解决的方法是在线程运行结束时手动地调用destroyAllWindows()函数,这样能够保证下次打开线程时,窗口可以重建并显示图像。
cv::VideoCapture cap(0);
cv::Mat frame;
std::thread cap_th(
[&ptr_camera]()
{
ctr = true;
while (ctr)
{
cap >> frame;
imshow("show", frame);
cv::waitKey(30);
}
cv::destroyAllWindows(); // 加上这一句之后,下一次能重建窗口并显示图像
}
);
cap_th.detach();