<p>已经发布的答案表明,<code>waitKey</code>获得的一些异常值是由于平台差异造成的。在下面,我建议(至少在某些平台上)明显奇怪的<code>waitKey</code>行为是由键盘修饰符引起的。这篇文章看起来和Tomasz的回答很相似,因为我最初是作为一个编辑来写的,但被拒绝了。</p>
<hr/>
<p>由<code>waitKey</code>返回的键代码根据启用的修饰符而变化。NumLock、CapsLock和Shift、Ctrl和Alt键都通过启用两个最低有效字节以上的某些位来修改由<code>waitKey</code>返回的键代码。这些标志中最小的一个在0x10000处移动。</p>
<p>Tomasz发布的脚本的修改版本如下:</p>
<pre><code>#!/usr/bin/env python
import cv2
import sys
cv2.imshow(sys.argv[1], cv2.imread(sys.argv[1]))
res = cv2.waitKey(0)
print 'You pressed %d (0x%x), 2LSB: %d (%s)' % (res, res, res % 2**16,
repr(chr(res%256)) if res%256 < 128 else '?')
</code></pre>
<p>结果如下:</p>
<ul>
<li><p>带数字锁的q字母:</p>
<p>您按了1048689(0x100071),2LSB:113('q')</p></li>
<li><p>带CapsLock但不带NumLock的逃生钥匙:</p>
<p>您按了131099(0x2001b),2LSB:27('\x1b')</p></li>
<li><p>带移位和数字锁的空格:</p>
<p>您按了1114144(0x110020),2LSB:32('')</p></li>
<li><p>带控制的右箭头键,NumLock关闭:</p>
<p>您按了327507(0x4ff53),2LSB:65363('S')</p></li>
</ul>
<p>我希望这有助于解释<code>waitKey</code>的异常行为,以及如何在不考虑NumLock和CapLock状态的情况下按下实际的键。从这里开始,做以下事情相对简单:</p>
<pre><code>ctrlPressed = 0 != res & (1 << 18)
</code></pre>
<p>…因为“控制键”标志是位19。移位在第17位,CapsLock的状态在第18位,Alt在第20位,NumLock在第21位。</p>