cv2.waitKey(1) 中的 0xFF 代表什么?

2025-03-14 08:57:00
admin
原创
15
摘要:问题描述:我试图理解以下代码片段中 0xFF 的具体作用:if cv2.waitKey(0) & 0xFF == ord('q'): break 有什么想法吗?解决方案 1:还要注意的是,如果激活了 NumLock,ord('q') 可能会返回不同的数字(其他键也可能出现这种情况)。例如,按下...

问题描述:

我试图理解以下代码片段中 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,没有waitKeyExwaitKey返回完整的键码。如果键码包含其他标志,则不再完全返回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:

  1. cv2.waitKey(0)-- 0 表示无论你的输出是什么,都会在屏幕上停留 0ms,即无限时间段

  2. 0xFF == ord('q')-- 表示接受键盘输入。这里'q'

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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1603  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1369  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   30  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   28  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   35  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用