我有相同的问题,我注意到窗口更新的帧率越来越慢,直到完全冻结。增加waitKey(x)的时间只能延长图像更新的时间,但是当cv2.imshow()需要计算的时间超过wait(Key)的时间时,它就会停止更新。
(略过这个抱怨:)
我认为cv2.imshow()和waitKey()的组合是一个完全的设计错误,为什么imshow()不仅仅是阻塞,直到UI更新呢?这将使生活变得更加轻松,而不必每次都调用waitKey()......
P.S.:在opencv内部有可能启动一个独立的线程来运行opencv窗口:
import cv2
img = cv2.imread("image.jpg")
cv2.startWindowThread()
cv2.namedWindow("preview")
cv2.imshow("preview", img)
来源:cv2.imshow命令在opencv-python中无法正常工作
对我来说,这并不起作用,因为每次运行时都会出现以下错误:
(python3:1177): GLib-GObject-CRITICAL **: g_object_unref: assertion 'G_IS_OBJECT (object)' failed
Attempt to unlock mutex that was not locked
Aborted
也许你可以尝试它并报告一下它是否适用于你?
编辑:
好吧,我通过创建一个单独的脚本imshow.py解决了我的问题:
import cv2
import os.path
while True:
if os.path.exists("image.pgm"):
image = cv2.imread("image.pgm")
if not image is None and len(image) > 0:
cv2.imshow("Frame", image)
cv2.waitKey(20)
我在另一个程序中使用以下代码将图像写入文件:cv2.imwrite("image.pgm", image)
我以以下方式调用脚本:
import subprocess
subprocess.Popen(["python3", "imshow.py"])
尽管有时会产生一些脏读,但对我来说已经足够了。更好的解决方案是在两个进程之间使用管道或队列。
cv2.waitKey
推送消息以使 GUI 正常工作。需要频繁调用它,以便 UI 能够响应所有必要的事件(例如重绘等)。如果处理时间过长,并且您同时希望拥有响应灵敏的 UI,则需要在单独的线程中进行处理。 - Dan Mašek