python 多个waitKey调用不能很好地与cv2配合使用

zpgglvta  于 2022-12-02  发布在  Python
关注(0)|答案(1)|浏览(150)

我发现在opencv程序中有不止一个waitKey调用会使程序延迟,并且所有调用都没有正确注册。有时候你必须按住一些键超过4秒,才能使代码执行。上述错误调用的工作原理如下:

if cv2.waitKey(1) == 100:
    show_crop = not show_crop

if cv2.waitKey(1) == 99:
    show_cv = not show_cv

if cv2.waitKey(1) == 116:
    show_curr_track = not show_curr_track

该程序检测不到所需的按钮按下调用,而是你需要按住所说的按钮几秒钟,在其代码执行.我该如何解决这个问题?

c9x0cxw0

c9x0cxw01#

我在我的程序中遇到了这个问题,并决定以问答的方式回答这个问题!我想出了一个非常简单的解决方法。首先,使用一个waitKey调用来获取所需的密钥,如-
inp = waitKey(1)
现在,创建一个字典,它的键作为你按下的按钮的序数,值作为你想要执行的代码(使用;或将代码拆分为单独的函数)-

d_exec = {
27: "cap.release();cv2.destroyAllWindows();break;",
100:"show_crop = not show_crop", 
99:"show_cv = not show_cv", 
116:"show_curr_track = not show_curr_track", 
115:"save()"
}

这里,27是Esc,99是c,116是t,115是s等等。如果你不知道键的实际整数值,你也可以使用ord函数。
最后,您可以将单个waitKey函数与字典结合使用,并使用内置的exec函数,如下所示-

inp = cv2.waitKey(1)
if inp in d_exec:
    exec(d_exec[inp])
inp = None

这里,exec函数接受一个字符串作为输入,并将其作为python代码运行。

注:使用;对于多行代码(如字典第1行所示),或将其分解为单行函数调用。

确保将inp设置回None或其他超出字典范围的值,以便在主循环的下一次迭代中不会意外执行相同的代码。
您还可以使用inp = waitKey(1)下面更传统的if else系列,但字典方法在我看来更简洁:)

相关问题