Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

ゲームっぽく、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))
MuAuan
2021年為になる記事にする 記事420いいね2000フォロワー200 2020年;いい記事を書く 記事359/350いいね1590/1500フォロワ ー144/150 2019年 記事275/300いいね1035/1000フォロワー97/100 2018年 記事140/200いいね423/500フォロワー48/50 7/8/2018 記事90いいね227フォロワー25
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away