[英]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.