opencv のキーに関連する関数について言及するとき、最初に思い浮かぶのは cv2.waitKey() と cv2.waitKeyEx() です。
最初に 2 つの違いについて説明しますと、waitKey は一部のキーに対応する ASCII コードを返すことのみをサポートしますが、waitKeyEx はすべてのキーのコードを返すことをサポートします。実際には、完全か不完全かの違いですが、一般的には waitKey があれば十分です。waitkey() の使用中にサポートされていないキーが押された場合、 cv2.waitKey() 関数の戻り値は 0 になるはずです。詳細については、opencv の公式ドキュメントを確認してください。
cv.waitKey() の戻り値は数値で、待機時間内にキーボードのキーが押された場合はそのキーに対応する ASCII コードが返され、待機時間を超えた場合やマウスをクリックして閉じられた場合は、戻り値は - 1 です。
まだ習得する必要があるのは、Python の組み込み関数である ord() 関数です。この関数は、文字に対応する ASCII コードを返すことです。このコードは文字のみであり、文字列ではありません。例えば:
num = ord('a')
print(num)
ここで、変数 num の値は、a に対応する ASCII コード、つまり 97 です。
次のコードでは、車の前進または回転の速度をキーボードで制御したいのですが、変数speedとturnはモーターの前進と回転のデューティサイクルですPWMパルス幅変調信号ですこのPWMの扱い方は信号があれば、モーターが作動します。ドライブが発射されます。ここでは、WS キーのみを使用して前進および後進速度を制御し、AD キーを使用して左折および右折の角度を制御します。PWM の実装については、Raspberry Pi の GPIO を呼び出すことで実装されますが、このブログでは取り上げません。
import cv2.cv2 as cv
img = cv.imread('xxx.jpg')
cv.imshow('t', img)
speed = 5 # 初始速度
turn = 0 # 初始转向
while True:
rate = cv.waitKey()
print(rate)
if rate == ord('w'):
speed = speed + 1
print('前进速度加一,当前前进速度是::{:.0f}'.format(speed))
while rate == ord('w'): # 防止长按此键,起和松手检测一样的作用
rate = cv.waitKey()
elif rate == ord('s'):
speed = speed - 1
print('前进速度减一当前前进速度是::{:.0f}'.format(speed))
while rate == ord('s'):
rate = cv.waitKey()
elif rate == ord('a'):
turn = turn - 1
print('左转加一,当前转向速度是::{:.0f}'.format(turn))
while rate == ord('a'):
rate = cv.waitKey()
elif rate == ord('d'):
turn = turn - 1
print('右转加一,当前转向速度是::{:.0f}'.format(turn))
while rate == ord('d'):
rate = cv.waitKey()
elif rate == ord('t'):
exit()
このコードを実行するには、キーボードのボタンを押す前に、CV ライブラリによって表示される画像上にマウスのフォーカスを置く必要があることに注意してください。
しかし、この書き込みによりハンドオフ検出、つまりキーの長押しによるpwm出力デューティの増減を防ぐことができます。ただし、wasd キーを一度押した後、2 回目の wasd 操作を実行するには、リリース検出の while ループから抜け出すために、先ほどとは別のキーを押す必要があるという問題も発生します。私のレベルが限られており、実際に必要なのは opencv ライブラリを組み合わせることであり、opencv-python ライブラリのみを使用する場合にのみそのような解決策を思いつくことができます。
ここでは改善のためのアイデアをいくつか紹介します。たとえば、タイム ライブラリを組み合わせたり、キーボード ライブラリを使用したり、ros のキーボード コントロール カーのソリューションを参照したりすることができます。その後の改善後は、引き続き共有していきます。
著者の許可なく転載することを禁止しますので、転載する場合は出典を明記の上、作者までご連絡ください。