繁体   English   中英

多个 waitKey 调用不适用于 cv2

[英]Multiple waitKey calls not working well with cv2

我发现 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

该程序在按下所需的按钮时没有检测到任何调用,而是您需要在其代码执行之前按住所述按钮多秒钟。 我该如何解决这个问题?

我在我的程序中遇到了这个问题,并决定以问答的方式回答这个问题。 我想出了一个非常简单的解决方法,首先,使用单个 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 等等。 如果您不知道键的实际 integer 值,也可以使用 ord function。

最后,您可以仅将单个 waitKey function 与您的字典结合使用,以及内置的exec function,如下所示 -

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

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

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

确保将inp设置回 None 或其他一些超出字典的值,这样相同的代码就不会在主循环的下一次迭代中意外执行。

您还可以在inp = waitKey(1)下面使用更传统的 if else 系列,但字典方法对我来说看起来更清晰:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM