cv2.waitKey(1) 中的 0xFF 代表什么?
- 2025-03-14 08:57:00
- admin 原创
- 16
问题描述:
我试图理解以下代码片段中 0xFF 的具体作用:
if cv2.waitKey(0) & 0xFF == ord('q'):
break
有什么想法吗?
解决方案 1:
还要注意的是,如果激活了 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
并且键的值将保持不变,现在我们可以将它与我们想要的任何键进行比较,例如你的问题
if key == ord('q'):
解决方案 2:
0xFF
`11111111是二进制的十六进制常数。通过
&对此常数进行按位与 ( ),它只保留原始值的最后 8 位(在本例中,无论什么
cv2.waitKey(0)`)。
解决方案 3:
cv2.waitKey() 返回一个 32 位整数值(可能取决于平台)。键输入是 ASCII,即 8 位整数值。因此,您只关心这 8 位,并希望所有其他位都为 0。您可以使用以下方法实现此目的:
cv2.waitKey(0) & 0xFF
解决方案 4:
在此代码中,
if cv2.waitKey(0) & 0xFF == ord('q'):
break
当没有任何输入时,该waitKey(0)
函数返回-1 。一旦事件发生(即按下按钮),它就会返回一个32 位整数。
在这种情况0xFF
下, 表示二进制11111111 ,一个8 位二进制数,因为我们只需要 8 位来表示一个字符,我们将 和 进行 ANDwaitKey(0)
运算0xFF
。结果得到一个小于 255 的整数。
ord(char)
返回字符的 ASCII 值,其最大值为 255。
因此,通过将整数与ord(char)
值进行比较,我们可以检查按键事件并中断循环。
解决方案 5:
通过这两次提交,的行为waitKey
在 v3.2(2016 年 12 月)中发生了根本性的变化。
所有平台上的当前行为如下:
waitKey
返回-1
或键码的最低 8 位
这是& 0xFF
通过库源完成的。
waitKeyEx
返回-1
或完整的键码
由此结果可以携带特殊键的附加标志,例如箭头键、F 键、修饰符(Ctrl、Alt、Shift)...
您不需要& 0xFF
带有 的内容。waitKey
它甚至是有害的,因为使用掩码,您无法再测试-1
(无键事件)。它变得与可能编码为 0xFF 的任何键都无法区分。
只需使用
if cv2.waitKey(...) == ord('q'):
...
q
这将检查是否按下了键。ord()
将字符串/字符转换q
为其 ASCII 整数代码。这是必需的,因为waitKey
返回的是整数而不是字符/字符串。
历史行为是只有waitKey
,没有waitKeyEx
。waitKey
返回完整的键码。如果键码包含其他标志,则不再完全返回ord('q')
。& 0xFF
是一个相当于掩码的按位运算。只保留键码的底部八位,因此会丢弃任何标志,这些标志将以更高的位携带。使用掩码,如果您按下该q
键,即使设置了任何标志,比较也会成功。
解决方案 6:
阅读此文可节省你的时间
注 1:
cv2.waitKey() 将返回您按下的关键字,如果您在窗口打开时单击关闭按钮,它将返回 -1
注 2:
假设您按下了“q”,那么 cv2.waitkey() 将返回“q”,但它返回的格式将为字符串数据类型,为了将其更改为二进制,我们在 & 符号的帮助下对 0xFF 执行按位与运算。 0xFF 是十六进制格式,也称为十六进制常数,十进制格式为 255,二进制格式为 11111111。
Decimal=255
Binary=11111111
Hexadecimal=0xff
**Note it is the same value in different formats **
注3:
我们都知道,python中的'&'用于执行按位'与'运算,
按位意味着我们在二进制级别执行与运算
,与运算逻辑:
**
0&0=0
0&1=0
1&0=0
1&1=1
**
下面是字母 'q' 的 asci 值和二进制值的小表
**Letter ASCII Code Binary **
q 113 01110001
注 4:由于我们给出了十六进制常数0xFF,
其二进制值为 11111111,让我们对字母“q”的二进制值 01110001 执行位与运算。
q= 01110001
0xFF=11111111
----------
01110001 ----->q so when do bitwise and operation we get the same value of q
----------
注5:
由于我们正在对十六进制常量 0xFF 执行按位与运算,一旦按位运算完成或执行,结果将更改为十进制格式,因此由于我们使用 ord('q') 函数,它将返回 'q' 的十进制值或 ASCII 值,因此如果条件变为真,则两者将相等,并且循环将中断
解决方案 7:
说实话,在这种情况下你不需要 0xFF。如果你需要cv2.waitkey(0) == ord(q)
它,它仍然会起作用。0xFF
仅用于屏蔽8bits
序列的最后一个,并且任何英文键盘字符的 ord() 都不会大于 255。你可以参考此ASCII 表来查找任何键盘字符的数值。
解决方案 8:
当参数是 unicode 对象时,ord(c)返回一个整数,表示字符 (c) 的 Unicode 代码点;当参数是 8 位字符串时,ord(c) 返回字节的值。
对于 64 位系统,*cv2.waitKey(0)的值与0xFF十六进制常量(二进制字符串11111111*的表示)进行按位与(&)运算,得出其最后 8 位。因此,使用 ord(c) 检查相等性。
解决方案 9:
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')
解决方案 10:
cv2.waitKey() 是将您的代码与键盘绑定的函数,您输入的任何内容都将由此函数返回。waitKey 的输出与 0xFF 进行逻辑与,以便可以访问最后 8 位。因此,最后 8 位代表来自键盘的输入,并使用 == 与您想要的字符进行比较。
解决方案 11:
就像您等待 0 毫秒并按下键盘上的“Q”一样,循环就会中断。
# If we've waited at least 1 ms And we've pressed the Esc
while True:
if cv2.waitKey(1) & 0xFF == 27:
break
cv2.destroyAllWindows()
解决方案 12:
cv2.waitKey(0)
-- 0 表示无论你的输出是什么,都会在屏幕上停留 0ms,即无限时间段0xFF == ord('q')
-- 表示接受键盘输入。这里'q'
正常情况下,我说这是试图保持输出打开直到用户按下'q'
键盘。