我正在构建一个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
答案 0 :(得分:0)
示例中使用的while
- 循环会占用100%的CPU时间,让wxPython无法处理任何事件。这就是您的应用崩溃的原因。
你必须摆脱while
并且必须将这部分集成到你的wxPython应用程序的事件处理程序中。 This example使用wx.Timer
定期轮询您的抓帧程序。
最好将OpenCV代码放在一个单独的线程中,并以线程安全的方式在OpenCV线程和wxPython主线程之间传输位图。
如何在wxPython中分离线程,请参阅LongRunningTasks,