如果没有imshow函数,为什么SetBitmap函数无法正常运行

时间:2018-01-15 08:25:44

标签: opencv wxpython

我正在构建一个wxPython应用程序,当通过更改静态位图图像显示每一帧时,我得到一个奇怪的错误,如果我在代码中有 imshow()函数,我的应用程序正常运行,如果我注释掉它,这个应用只运行1-2秒并且崩溃,没有找到错误信息,命令屏幕仍然显示我打印时经过的时间。 这是我的代码

video_capture = VideoStream(0).start()
time.sleep(2.0)
fps = FPS().start()

count = 0;

while True:
    frame = video_capture.read()
    frame = imutils.resize(frame, width=720, height=480)

    t = time.time()

    output_rgb = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)

    self.bitmap_1.SetBitmap(wx.Bitmap.FromBuffer(output_rgb.shape[1], output_rgb.shape[0], output_rgb.tostring()))
    self.Refresh()

    cv2.imshow('Video', output_rgb)
    fps.update()

    print('[INFO] elapsed time: {:.2f}'.format(time.time() - t))

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

fps.stop()

这是bitmap_1的首字母

self.bitmap_1 = wx.StaticBitmap(self, bitmap=wx.EmptyBitmap(720, 540))

抱歉我的英语不好,我使用的是python 3.6.2

1 个答案:

答案 0 :(得分:0)

示例中使用的while - 循环会占用100%的CPU时间,让wxPython无法处理任何事件。这就是您的应用崩溃的原因。

你必须摆脱while并且必须将这部分集成到你的wxPython应用程序的事件处理程序中。 This example使用wx.Timer定期轮询您的抓帧程序。

最好将OpenCV代码放在一个单独的线程中,并以线程安全的方式在OpenCV线程和wxPython主线程之间传输位图。

如何在wxPython中分离线程,请参阅LongRunningTasks