多个waitKey调用不能很好地与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)

现在,创建一个字典,它的键是你按下的按钮的序数,值是你想要执行的代码(use;对于多行代码,或者将代码分解成一个单独的函数)-

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系列,但是对我来说字典方法看起来更干净:)

最新更新