cv2.waitKey(1)中的0xFF是多少?

Dor*_*ora 39 python hex opencv

我正在尝试了解0xFF在以下代码片段中做了什么:

if cv2.waitKey(0) & 0xFF == ord('q'):
    break
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

She*_*ila 55

同样重要的是要注意,如果你激活了NumLock,ord('q')可以返回不同的数字(也许它也会与其他键一起发生).例如,当按c时,代码:

key = cv2.waitKey(10) 
print(key) 
Run Code Online (Sandbox Code Playgroud)

回报

 1048675 when NumLock is activated 
 99 otherwise
Run Code Online (Sandbox Code Playgroud)

将这两个数字转换为二进制,我们可以看到:

1048675 = 100000000000001100011
99 = 1100011
Run Code Online (Sandbox Code Playgroud)

我们可以看到,最后一个字节是相同的.然后由于NumLock的状态,有必要只取最后一个字节.因此,我们执行:

key = cv2.waitKey(33) & 0b11111111  
# 0b11111111 is equivalent to 0xFF
Run Code Online (Sandbox Code Playgroud)

并且key的值将保持不变,现在我们可以将它与我们想要的任何键(例如您的问题)进行比较

if key == ord('q'):
Run Code Online (Sandbox Code Playgroud)

  • **2016 年 12 月**,这种情况已不再成立。从那时起,waitKey 总是只返回最低 8 位,因此屏蔽是*多余的*(停止这样做)。要获取扩展信息(例如获取箭头键),您现在必须使用 waitKeyEx。 (2认同)

小智 29

0xFF是十六进制常量,是11111111二进制的.通过&对此常量使用按位AND(),它只留下原始的最后8位(在这种情况下,无论cv2.waitKey(0)是什么).


小智 25

cv2.waitKey()返回32位整数值(可能取决于平台).键输入为ASCII,即8位整数值.所以你只关心这8位,并希望所有其他位为0.这可以通过以下方式实现:

cv2.waitKey(0) & 0xFF
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案 (2认同)

Chr*_*itz 14

waitKey v3.2(2016 年 12 月)中的行为已更改。

当前的行为是这样的:

  • waitKey返回-1或键码的最低 8 位
  • waitKeyEx返回-1完整的键码,其中可以包含特殊键的附加标志(例如箭头键、修饰符等)

不需要& 0xFF的东西waitKey。它甚至是有害的,因为通过屏蔽,您无法再测试-1(无关键事件)。它与任何可能编码为 0xFF 的密钥无法区分。

只需使用

if cv2.waitKey(...) == ord('q'):
    ...
Run Code Online (Sandbox Code Playgroud)

这会检查该键是否q被按下。ord()将字符串/字符转换q为其 ASCII 整数代码。这是必需的,因为waitKey返回一个整数。

历史行为是只有,没有返回完整的键码。waitKeywaitKeyExwaitKey

如果键码包含额外的标志,那么它就不再是这样了ord('q')。这& 0xFF是相当于掩码的按位运算。仅保留键码的底部八位,因此丢弃较高位中的任何标志。q如果您按下该键,即使设置了任何标志,比较也会成功。


小智 12

在这段代码中,

if cv2.waitKey(0) & 0xFF == ord('q'):
    break
Run Code Online (Sandbox Code Playgroud)

当没有任何输入时,该waitKey(0)函数返回-1。一旦事件发生,即按下按钮,它会返回一个32 位整数

0xFF此方案中表示二进制11111111一个8位二进制,因为我们只需要8个比特来表示一个字符,我们与waitKey(0)0xFF。结果,得到一个小于 255 的整数。

ord(char) 返回字符的 ASCII 值,最大为 255。

因此,通过将整数与ord(char)值进行比较,我们可以检查按键事件并中断循环。


Dan*_*ley 9

说实话,在这种情况下,您不需要 0xFF。如果你这样做了,cv2.waitkey(0) == ord(q)它会起作用。0xFF仅用于屏蔽8bits序列的最后一个,并且任何键盘字符的 ord() 不会大于 255。您可以参考此ASCII 表来查找任何键盘字符的数值。


Ind*_*ddy 7

**阅读此内容将节省您的时间**

注意 1: cv2.waitKey() 将返回您按下的关键字,以防您在窗口打开时单击关闭按钮,然后它将返回 -1

注意 2: 让我们假设您按下了 'q' 然后 cv2.waitkey() 将返回那个 'q' 但它返回的格式将是字符串数据类型,以便将其更改为二进制我们正在执行按位与操作& 符号与 0xFF 的帮助。0xFF 是十六进制格式,也称为十六进制常数,十进制格式为 255,二进制格式为 11111111。


    Decimal=255
    Binary=11111111
    Hexadecimal=0xff

Run Code Online (Sandbox Code Playgroud)
**Note it is the same value in different formats **
Run Code Online (Sandbox Code Playgroud)

注3: 我们都知道python中的'&'是用来进行按位的'And'操作的, Bitwise的意义在于我们在二进制级别执行And操作的 AND操作逻辑: **

        0&0=0
        0&1=0
        1&0=0
        1&1=1
Run Code Online (Sandbox Code Playgroud)

**

下面代表字母'q'的asci值和二进制值的小表

**Letter    ASCII Code  Binary  **
  q           113      01110001    
Run Code Online (Sandbox Code Playgroud)

注 4:由于我们给出了十六进制常量0xFF, 其二进制值为 11111111,让我们用字母“q”的二进制值 01110001 执行位与运算。

        q= 01110001
      0xFF=11111111
          ----------
           01110001   ----->q so when do bitwise and operation we get the same value of q
          ----------
Run Code Online (Sandbox Code Playgroud)

注 5:

由于我们使用的是十六进制常量 0xFF 执行按位与运算,一旦按位运算完成或执行,结果将变为十进制格式,因此由于我们使用 ord('q') 函数将返回十进制'q' 的值或 ASCII 值,因此如果条件变为真并且循环将中断,则两者都将等于条件