winforms Thread.Sleep()无法与Cv2.ImShow、OpenCvSharp、C#一起使用

oalqel3c  于 2022-11-17  发布在  C#
关注(0)|答案(1)|浏览(174)

非常简单的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();

    }
h6my8fg2

h6my8fg21#

waitKey的目的不是等待,而是*旋转OpenCV使用的GUI事件循环***。如果不调用它,OpenCV的GUI将无法工作。
您已经在使用C#和WinForms(从标记判断),所以您应该使用WinForms而不是imshow。OpenCV有自己的GUI事件处理,可能会与同一程序中使用的其他GUI工具包冲突。
OpenCV的GUI函数通常不能安全地从线程中调用,因为一些GUI后端不允许这样做。
没有**一个“线程”。你有一个按钮点击事件的处理程序。它是由你的WinForms应用程序的事件循环执行的。它发生在主线程中,在每个进程中总是存在的。它不是一个衍生线程。

相关问题