树莓派 python opencv 没有键鼠该怎么关闭窗口?(让右上角叉号能关闭窗口)

背景

在某些特殊的情况下,也许只能触摸屏幕控制树莓派。但是用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)

你可能感兴趣的:(树莓派)