非常简单的C# Winforms应用程序,OpenCVSharp4,Thread.Sleep()不起作用。看起来(正如我猜测的)Cv2不能在多个线程中使用,例如,一个线程创建NamedWindow,另一个线程创建ImShow。但下面这个简单的代码仍然令人困惑。
private void button1_Click(object sender, EventArgs e)
{
VideoCapture video = new VideoCapture("E:/RankingBack.mp4");
Mat frame = new Mat();
while (true)
{
video.Read(frame);
Cv2.ImShow(" ", frame);
//Cv2.WaitKey(33); // WORKS
Thread.Sleep(33); // DOES NOT WORK
}
frame.Dispose();
video.Release();
Cv2.DestroyAllWindows();
}
1条答案
按热度按时间h6my8fg21#
waitKey
的目的不是等待,而是*旋转OpenCV使用的GUI事件循环***。如果不调用它,OpenCV的GUI将无法工作。您已经在使用C#和WinForms(从标记判断),所以您应该使用WinForms而不是
imshow
。OpenCV有自己的GUI事件处理,可能会与同一程序中使用的其他GUI工具包冲突。OpenCV的GUI函数通常不能安全地从线程中调用,因为一些GUI后端不允许这样做。
你没有**一个“线程”。你有一个按钮点击事件的处理程序。它是由你的WinForms应用程序的事件循环执行的。它发生在主线程中,在每个进程中总是存在的。它不是一个衍生线程。