【ゲーム】cv2.waitKeyの学習用アプリを作って遊んでみた♪

ゲームっぽく、waitKeyのキー入力と数字（キーコード）の関係を理解するためのアプリを作ってみた。

###わかったこと
①waitKeyの使い方
②文字をランダムに出力する
③文字入力input文との併用ができない
④k == 27、k == ord('s')、そしてchr(k) == 'q'で判定

###①waitKeyの使い方
参考に詳細な説明があるが、そのまとめアプリから出発することとする。
【参考】
・[OpenCV-Python Tutorials 1 documentation » OpenCV-Pythonチュートリアル » OpenCVのGUI機能 »](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_gui/py_image_display/py_image_display.html)

```py
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
](https://stackoverflow.com/questions/2257441/random-string-generation-with-upper-case-letters-and-digits-in-python)

```py
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文との併用ができない
これはどうもできない・・・らしい
>以下の入力を入れようとしたが、どうも画像が応答なしになってしまう？？

```py
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](https://codeyarns.com/2015/01/20/how-to-use-opencv-waitkey-in-python/)
なお、保存される画像のファイルサイズはかなり異なります。


```py
    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
```
出力は以下のとおりで納めました。

```py
    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のキーコード一覧](http://d.hatena.ne.jp/tosh914/20121120/1353415648)

```py
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))
```