What's 0xFF for in cv2.waitKey(1)?

时间:2016-02-12 21:45:01

标签: python opencv hex

I'm trying understand what 0xFF does under the hood in the following code snippet:

runat="server"

Any ideas?

11 个答案:

答案 0 :(得分:44)

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

key = cv2.waitKey(10) 
print(key) 

返回

 1048675 when NumLock is activated 
 99 otherwise

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

1048675 = 100000000000001100011
99 = 1100011

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

key = cv2.waitKey(33) & 0b11111111  
# 0b11111111 is equivalent to 0xFF

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

if key == ord('q'):

答案 1 :(得分:21)

@Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(MessageEvent event) { textField.setText(event.message); } is a hexadecimal constant which is 0xFF in binary. By using bitwise AND (11111111) with this constant, it leaves only the last 8 bits of the original (in this case, whatever & is).

答案 2 :(得分:20)

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

cv2.waitKey(0) & 0xFF

答案 3 :(得分:3)

当参数是unicode对象时,

ord(c)返回表示字符(c)的Unicode代码点的整数,或者当参数是8位字符串时返回字节的值。

对于64位系统, cv2.waitKey(0)的值是按位AND(&),带有 0xFF 十六进制常量(表示为二进制字符串 11111111 ),它产生最后8位。因此用ord(c)检查eqality。

答案 4 :(得分:3)

说实话,你不需要0xFF。如果你做了cv2.waitkey(0) == ord(q),那么它将完全相同。 0xFF仅用于屏蔽序列的最后8bits,并且任何键盘字符的ord()都不会大于255.您可以引用此ASCII Table来查找数字任何键盘字符的值。

答案 5 :(得分:3)

在此代码中,

                   if cv2.waitKey(0) & 0xFF == ord('q'):
                       break

在没有任何输入的情况下,waitKey(0)函数将返回 -1 。事件一旦发生,即按下按钮会返回一个 32位整数

在这种情况下,0xFF表示二进制 11111111 二进制 8位二进制,因为我们只需要8位来表示一个字符,而我们与{{1 }}到waitKey(0)。结果,获得小于255的整数。

0xFF返回字符的ASCII值,该值将再次最大为255。

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

答案 6 :(得分:2)

**阅读此书将节省您的时间**

注1:cv2.waitKey()将返回您按下的关键字,以防万一您只是点击了 打开窗口时关闭按钮,则返回-1

Note 2: let us assume that you have pressed 'q', then cv2.waitkey() will return that 'q' but the format it returns will be in string data type in order to change it to binary we are performing bitwise AND operation(&) with 0xFF which is in hexadecimal format also know as hexadecimal constant, which is 255 in decimal or 11111111 in binary.
Decimal-255
Binary-11111111
Hexadecimal-0xff
**Note it is the same value in different formats **

Note 3: we all know that '&' in python is used to perform bitwise 'And' operation, 
  **Bitwise in the sense we perform the And operation at binary level **
AND operation logic:
0&0=0
0&1=0
1&0=0
1&1=1

below represents the small table of asci value and binary value of letter 'q'

**Letter    ASCII Code  Binary  **
  q           113      01110001    

Note 4: since we have given the hexadecimal constant **0xFF** whose value in binary is 11111111, let's perform the bit AND OPERATION with the binary value of letter 'q' which 
is  01110001.

        q= 01110001
      0xFF=11111111
          ----------
           01110001   ----->q so when do bitwise and operation we get the same value of q
          ----------
Note 5: since we are performing bitwise And operation with 0xFF which is a hexadecimal constant, ** once the bitwise operation is completed or performed, the result will change to the decimal format, so since we are using ord('q') function which will return the decimal value or ASCII value of 'q', so both will be equal the condition if condition becomes true and the loop will break 

答案 7 :(得分:1)

cv2.waitKey()是将代码与键盘绑定的函数,该函数将返回您键入的任何内容。 然后,将waitKey的输出与0xFF进行逻辑“与”运算,以便可以访问最后8位。 因此,最后8位代表键盘输入,并使用==与所需字符进行比较。

答案 8 :(得分:1)

如果没有按下任何键,

cv2.waitKey() 返回值 -1。当您按下一个键时,它会返回该键的 ASCII 值。所以如果你这样做

 k = cv2.waitKey(0)
 if k == ord('b'):
    break

当按下 b 键时,k 的值将是 98,它等于 ord('b') 的值,即 98,并且此条件为真导致中断。 但是,根据平台或键盘修饰符,将返回 32 位整数值。在这种情况下,最好使用 cv2.waitKey() & 0xFF,它在二进制 AND 运算中将导致按下的键的值,并且可以与 ord('key')

进行比较

答案 9 :(得分:0)

waitKey has changed in v3.2 (December 2016) 的行为。

当前的行为是这样的:

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

不需要带有& 0xFF的{​​{1}}东西。 只需使用

waitKey

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

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

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

答案 10 :(得分:-1)

  1. cv2.waitKey(0) -- 0 表示您的输出将在屏幕上停留 0 毫秒,即无限时间段
  2. 0xFF == ord('q') -- 表示接受键盘输入。这里是 'q'

在正常情况下,我说这是试图保持输出打开,直到用户按下键盘上的 'q'