在某些特殊的情况下,也许只能触摸屏幕控制树莓派。但是用OpenCV实时检测时,弹出的窗口即使点击了右上角x号还是会继续弹出来。需要一种方法使它能被直接关掉。
下面截取常规代码中一部分
while True:
#省略省略省略省略
cv2.imshow('xxxxxx', frame)
#有键盘在这可以按Q键退出循环
if cv2.waitKey(1) & 0xFF==ord('q'):
print('quit')
break
#省略省略省略省略
显然可知imshow在无限循环内,即使点击x号关闭窗口,到下一个循环执行这条代码时窗口又会跳出来
通过如下函数。如果窗口不存在会返回 -1
cv2.getWindowProperty('xxxxxx',1)#xxxxxx是窗口名
所以可在代码中加入这个if语句
if cv2.getWindowProperty('xxxxxx',1) < 0:
print('quit')
break
我猜你可能会这样加入
while True:
#省略省略省略省略
cv2.imshow('xxxxxx', frame)
#使能够通过右上角叉号退出循环
if cv2.getWindowProperty('xxxxxx',1) < 0:
print('quit')
break
#有键盘在这可以按Q键退出循环
if cv2.waitKey(1) & 0xFF==ord('q'):
print('quit')
break
#省略省略省略省略
会发现没有效果,因为这样cv2.getWindowProperty仅仅起作用与imshow与其之间。换言之只有正好在程序执行到imshow和getWindowProperty之间超级超级超级超级短的时间内点击x号才能跳出循环。这不是人能做到的事情【滑稽】
固移到前面
while True:
#省略省略省略省略
#使能够通过右上角叉号退出循环
if cv2.getWindowProperty('xxxxxx',1) < 0:
print('quit')
break
cv2.imshow('xxxxxx', frame)
#有键盘在这可以按Q键退出循环
if cv2.waitKey(1) & 0xFF==ord('q'):
print('quit')
break
#省略省略省略省略
然而程序一执行就退出了。因为第一遍循环时窗口还没打开,getWindowProperty自然返回-1,成功跳出循环
最终解决方法:
ret,frame=cap.read()
cv2.imshow('pedestrian-detection', frame)
while True:
#省略省略省略省略
#使能够通过右上角叉号退出循环
if cv2.getWindowProperty('xxxxxx',1) < 0:
print('quit')
break
cv2.imshow('xxxxxx', frame)
#有键盘在这可以按Q键退出循环
if cv2.waitKey(1) & 0xFF==ord('q'):
print('quit')
break
#省略省略省略省略
在无限循环开始前先弹出一下窗口
或者在循环前先把窗口打开
cv2.namedWindow('xxxxxx', cv2.WINDOW_NORMAL)