次のコードスニペットで、0xFFが内部で行うことを理解しようとしています。
if cv2.waitKey(0) & 0xFF == ord('q'):
break
何か案は?
0xFF
は、バイナリの11111111
である16進定数です。この定数でビット単位のAND(&
)を使用すると、元の最後の8ビットのみが残ります(この場合、cv2.waitKey(0)
が何であっても)。
NumLockがアクティブになっている場合は、ord( 'q')が異なる数値を返す可能性があることに注意することも重要です(他のキーでも発生する可能性があります)。たとえば、cを押すと、コードは次のようになります。
key = cv2.waitKey(10)
print(key)
返却値
1048675 when NumLock is activated
99 otherwise
これらの2つの数値を2進数に変換すると、次のことがわかります。
1048675 = 100000000000001100011
99 = 1100011
ご覧のとおり、最後のバイトは同じです。 NumLockの状態が原因で残りが発生するため、この最後のバイトだけを取得する必要があります。したがって、以下を実行します。
key = cv2.waitKey(33) & 0b11111111
# 0b11111111 is equivalent to 0xFF
キーの値は同じままであるため、質問などの任意のキーと比較できます
if key == ord('q'):
cv2.waitKey()は32ビット整数値を返します(プラットフォームに依存する場合があります)。キー入力は、8ビット整数値であるASCIIにあります。したがって、これらの8ビットのみを気にし、他のすべてのビットを0にする必要があります。これは次の方法で実現できます。
cv2.waitKey(0) & 0xFF
このコードでは、
if cv2.waitKey(0) & 0xFF == ord('q'):
break
waitKey(0)
関数は、入力がまったく行われないときに-1を返します。イベントが発生するとすぐにボタンが押された場合、2ビット整数を返します。
このシナリオの0xFF
は、バイナリを表します11111111 a 8ビットバイナリ。文字を表すのに必要なのは8ビットのみであり、waitKey(0)
から0xFF
。その結果、255未満の整数が取得されます。
ord(char)
は、再び最大255になる文字のASCII値を返します。
したがって、整数をord(char)
値と比較することにより、キーが押されたイベントを確認し、ループを中断できます。
本当にこの場合、0xFFは必要ありません。 cv2.waitkey(0) == ord(q)
を実行すると、すべて同じように動作します。 0xFF
は、シーケンスの最後の8bits
をマスクするために使用され、キーボード文字のord()は255以下です。これを参照できます ASCIIテーブル キーボード文字の数値を見つけるため。
ord(c)は、引数がUnicodeオブジェクトの場合はcharacter(c)のUnicodeコードポイントを表す整数を返し、引数が8ビット文字列の場合はバイトの値を返します。
64ビットシステムの場合、cv2.waitKey(0)の値は、xFF 16進定数(バイナリ文字列11111111)。その結果、最後の8ビットになります。したがって、ord(c)で等式をチェックします。