web-dev-qa-db-ja.com

cv2.waitKey(1)の0xFFは何ですか?

次のコードスニペットで、0xFFが内部で行うことを理解しようとしています。

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

何か案は?

36
Dora

0xFFは、バイナリの11111111である16進定数です。この定数でビット単位のAND(&)を使用すると、元の最後の8ビットのみが残ります(この場合、cv2.waitKey(0)が何であっても)。

24
Kevin W.

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'):
50
Sheila

cv2.waitKey()は32ビット整数値を返します(プラットフォームに依存する場合があります)。キー入力は、8ビット整数値であるASCIIにあります。したがって、これらの8ビットのみを気にし、他のすべてのビットを0にする必要があります。これは次の方法で実現できます。

cv2.waitKey(0) & 0xFF
24
johnny b

このコードでは、

                   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)値と比較することにより、キーが押されたイベントを確認し、ループを中断できます。

4
Kuldeep Thakre

本当にこの場合、0xFFは必要ありません。 cv2.waitkey(0) == ord(q)を実行すると、すべて同じように動作します。 0xFFは、シーケンスの最後の8bitsをマスクするために使用され、キーボード文字のord()は255以下です。これを参照できます ASCIIテーブル キーボード文字の数値を見つけるため。

3
Daniel Copley

ord(c)は、引数がUnicodeオブジェクトの場合はcharacter(c)のUnicodeコードポイントを表す整数を返し、引数が8ビット文字列の場合はバイトの値を返します。

64ビットシステムの場合、cv2.waitKey(0)の値は、xFF 16進定数(バイナリ文字列11111111)。その結果、最後の8ビットになります。したがって、ord(c)で等式をチェックします。

3
jaykay