ゲームっぽく、waitKeyのキー入力と数字(キーコード)の関係を理解するためのアプリを作ってみた。
わかったこと
①waitKeyの使い方
②文字をランダムに出力する
③文字入力input文との併用ができない
④k == 27、k == ord('s')、そしてchr(k) == 'q'で判定
①waitKeyの使い方
参考に詳細な説明があるが、そのまとめアプリから出発することとする。
【参考】
・OpenCV-Python Tutorials 1 documentation » OpenCV-Pythonチュートリアル » OpenCVのGUI機能 »
import numpy as np
import cv2
img = cv2.imread('messi5.jpg',0)
cv2.imshow('image',img)
k = cv2.waitKey(0)
if k == 27: # wait for ESC key to exit
cv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
cv2.imwrite('messigray.png',img)
cv2.destroyAllWindows()
②文字をランダムに出力する
これにゲーム性を持たせるように以下のように変更した。
まず、文字をランダムに出力するには、以下の参考のとおり
【参考】
・Random string generation with upper case letters and digits in Python
import numpy as np
import cv2
import random
img = cv2.imread('messi5.jpg',0)
cv2.imshow('image',img)
while True:
rl = random.choice("abcdefghijklmnopqrstuvwxyz1234567890")
print(rl,'に対応するwaitKeyの数字は')
③文字入力input文との併用ができない
これはどうもできない・・・らしい
以下の入力を入れようとしたが、どうも画像が応答なしになってしまう??
print('対応する数字を入力してください。')
your_num = input('>>> ')
print(your_num)
④k == 27、k == ord('s')、そしてchr(k) == 'q'で判定
前の二つの方法はよく見るけど、最後のchr(k) == 'q'で判定はあまり見ないけど、出来ました。
【参考】
・How to use OpenCV waitKey in Python
なお、保存される画像のファイルサイズはかなり異なります。
k = cv2.waitKey(0)&0xff
if k == 27: # wait for ESC key to exit
cv2.destroyAllWindows()
break
elif k == ord('s'): # wait for 's' key to save and exit
cv2.imwrite('messigray.png',img)
cv2.destroyAllWindows()
break
elif chr(k) == 'q': # wait for 'q' key to save and exit
cv2.imwrite('messigray.jpg',img)
cv2.destroyAllWindows()
break
出力は以下のとおりで納めました。
else:
print('あなたの入力したキー入力は ',chr(k),'、正解は ',rl)
print('あなたの入力したキーの変換は ',k,'、正解は ',ord(rl))
まとめ
・cv2.waitKeyの学習用アプリを作って遊んでみた
以下を理解した
・②文字をランダムに出力する
・③文字入力input文との併用ができない
・④k == 27、k == ord('s')、そしてchr(k) == 'q'で判定
おまけ
どうしても気になったので、ESCキーのchrを見てみました。
結果は、
「ESCキーは 、数字は 27」
だそうです。 「」は標準出力では、「・」に見えます。
【参考】
・highguiのキーコード一覧
import numpy as np
import cv2
import random
img = cv2.imread('messi5.jpg',0)
cv2.imshow('image',img)
while True:
rl = random.choice("abcdefghijklmnopqrstuvwxyz1234567890")
print(rl,'に対応するwaitKeyの数字は')
k = cv2.waitKey(0)&0xff
if k == 27: # wait for ESC key to exit
cv2.destroyAllWindows()
print('ESCキーは ',chr(k),'、数字は ',k)
break
elif k == ord('s'): # wait for 's' key to save and exit
cv2.imwrite('messigray.png',img)
cv2.destroyAllWindows()
break
elif chr(k) == 'q': # wait for 'q' key to save and exit
cv2.imwrite('messigray.jpg',img)
cv2.destroyAllWindows()
break
else:
print('あなたの入力したキー入力は ',chr(k),'、正解は ',rl)
print('あなたの入力したキーの変換は ',k,'、正解は ',ord(rl))