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)
小智 25
cv2.waitKey()返回32位整数值(可能取决于平台).键输入为ASCII,即8位整数值.所以你只关心这8位,并希望所有其他位为0.这可以通过以下方式实现:
cv2.waitKey(0) & 0xFF
Run Code Online (Sandbox Code Playgroud)
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)值进行比较,我们可以检查按键事件并中断循环。
**阅读此内容将节省您的时间**
注意 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 值,因此如果条件变为真并且循环将中断,则两者都将等于条件