ord('q')和0xFF的用法

5
我能够帮助您翻译以下代码片段 -

我无法理解以下代码片段 -

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

在这段代码中 -
    1 import numpy as np
    2 import cv2
    3 
    4 cap = cv2.VideoCapture(0)
    5 
    6 while(True):
    7     # Capture frame-by-frame
    8     ret, frame = cap.read()
    9 
   10     # Our operations on the frame come here
   11     gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
   12 
   13     # Display the resulting frame
   14     cv2.imshow('frame',gray)
   15     if cv2.waitKey(1) & 0xFF == ord('q'):
   16         break
   17 
   18 # When everything done, release the capture
   19 cap.release()
   20 cv2.destroyAllWindows()

ord('q') 和 0xFF 是什么意思?它在这里是如何使用的?
3个回答

14
  • ord('q')返回q的Unicode代码点
  • cv2.waitkey(1)返回对应于按下键的32位整数
  • & 0xFF是一个位掩码,将左侧的24位设置为零,因为ord()返回值介于0和255之间,因为您的键盘只有有限的字符集
  • 因此,一旦应用了掩码,就可以检查它是否是相应的键。

谢谢!我们有办法添加暂停-播放效果吗? - IronVenom
https://dev59.com/u5jga4cB1Zd3GeqPJ2t1 - The Pineapple
这样,如果我们这样做,就不必添加0xFF部分了,对吧? - IronVenom
加上那部分不会有害,但对于你正在做的事情来说应该没有影响。 - The Pineapple
1
@IronVenom 只是想补充一下,某些系统中的waitKey返回按下键的ASCII表示,并且一些位会翻转为alt、ctrl、caps lock和其他特殊键。这些通常是第一个位,这就是为什么使用0xFF或有时只是255,因为它将进行按位与操作并且第一个位将被设置为0。 - api55

6

首先,将执行cv2.waitKey(1) & 0xFF

  • 等待1毫秒以等待用户按键。
  • 如果用户按下了例如q这样的键,则waitKey返回q十进制值,在二进制中表示为0b01110001
  • 接下来,执行AND运算,其中两个输入分别是0b01110001和0xFF(0b11111111)。

0b01110001 AND 0b11111111 = 0b01110001。确切的结果是q十进制值

其次,将左侧表达式的值0b01110001ord('q')进行比较。显然,这些值相同,结果就是调用break


3
根据cv2.waitkey文档,该函数返回按下的按键代码,如果在指定时间内没有按键被按下,则返回-1。
通常在OpenCV教程和博客中,使用“q”键作为停止任何不确定操作(例如从摄像头捕获帧)的惯例。在您的情况下,程序在每次迭代中无限期地检查是否使用cv2.waitKey(1)&0xFF == ord('q')语句按下了“q”键。 如果True,则简单地中断无限循环while。您可以将其设置为您选择的任何键。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接