72

私は、を使用しspacebarて次のフレームに移動しEsc、プログラムを終了するプログラム(python、opencv)に取り組んでいます。これらは私が働いている唯一の2つの鍵です。私はもっ​​と多くのキーについて調べようとしました、それらのために様々なコードを試しましたが、うまくいきませんでした。特に矢印キー。

私はこれについて見つけましwaitkeyたが、機能しません。

だから私の質問は、 Python-opencvプログラムで他のキーをキャッチして特定の関数をトリガーするにはどうすればよいescですか?spacebar

4

12 に答える 12

117

ord()そのためにPythonの関数を使用できます。

たとえば、「a」キーの押下をトリガーする場合は、次のようにします。

if cv2.waitKey(33) == ord('a'):
   print "pressed a"

ここでサンプルコードを参照してください:ヒストグラムの描画

アップデート :

任意のキーのキー値を見つけるには、次のような簡単なスクリプトを使用してキー値を出力します。

import cv2
img = cv2.imread('sof.jpg') # load a dummy image
while(1):
    cv2.imshow('img',img)
    k = cv2.waitKey(33)
    if k==27:    # Esc key to stop
        break
    elif k==-1:  # normally -1 returned,so don't print it
        continue
    else:
        print k # else print its value

このコードで、私は次の値を取得しました:

Upkey : 2490368
DownKey : 2621440
LeftKey : 2424832
RightKey: 2555904
Space : 32
Delete : 3014656
...... # Continue yourself :)
于 2013-01-24T04:44:17.857 に答える
25

によって返されるキーコードは、waitKeyプラットフォームに依存しているようです。ただし、キーが何を返すかを確認することは非常に教育的かもしれません(ちなみに、私のプラットフォームでは、Escは27を返しません...)

アビッドの回答リストの整数は、人間の心にはほとんど役に立たない(あなたが天才のサバンでない限り...)。ただし、それらを16進数で調べたり、最下位バイトを調べたりすると、パターンに気付く場合があります...

からの戻り値を調べるための私のスクリプトwaitKeyは以下のとおりです。

#!/usr/bin/env python

import cv2
import sys

cv2.imshow(sys.argv[1], cv2.imread(sys.argv[1]))
res = cv2.waitKey(0)
print('You pressed %d (0x%x), LSB: %d (%s)' % (res, res, res % 256,
    repr(chr(res%256)) if res%256 < 128 else '?'))

最小限のコマンドライン画像ビューアとして使用できます。

私が得たいくつかの結果:

  • qレター:

    1048689(0x100071)、LSB:113('q')を押しました

  • エスケープキー(従来はASCII 27):

    1048603(0x10001b)、LSB:27('\ x1b')を押しました

  • スペース:

    1048608(0x100020)、LSB:32('')を押しました

このリストは続く可能性がありますが、「奇妙な」結果が得られた場合は、その方法がわかります。

ところで、ループに入れたい場合は、戻り値waitKey(0)を無視する代わりに、(永遠に待つ)ことができます。-1

編集:これらの上位ビットには、目に見える以上のものがあります-Andrew Cの回答を参照してください(ヒント:すべての「ロック」(NumLockなど)のようなキーボード修飾子と関係があります)。

ただし、最近の経験では、プラットフォームに依存していることが示されています。たとえば、Windows上のPython3.6上のAnacondaのOpenCV4.1.0はこれらのビットを生成せず、一部の(重要な)キーは(0矢印waitKey()、、、、、、および)。少なくとも戻ります(しかし...なぜそうではありませんか?)。HomeEndPageDnPageUpDelInsBackspace8Del

したがって、クロスプラットフォームUIの場合、おそらく、、、、、文字W、数字、、、Aおよび; )に制限されます。SDEscSpaceBackspace

于 2013-12-13T22:23:56.727 に答える
15

すでに投稿されている回答は、によって得られた異常な値のいくつかがwaitKeyプラットフォームの違いによるものであることを示唆しています。以下に、(少なくとも一部のプラットフォームでは)明らかに奇妙な動作がwaitKeyキーボード修飾子によるものであることを提案します。私が最初にこれを編集として書いたので、この投稿はTomaszの答えに似ていますが、拒否されました。


waitKey有効になっている修飾子に応じて、変更によって返されるキーコードが変更されます。NumLock、CapsLock、およびShift、Ctrl、およびAltキーはすべてwaitKey、2つの最下位バイトより上の特定のビットを有効にすることによって返されるキーコードを変更します。これらのフラグの最小のものは、0x10000でのShiftです。

Tomaszが投稿したスクリプトの修正版を以下に示します。

#!/usr/bin/env python

import cv2
import sys

cv2.imshow(sys.argv[1], cv2.imread(sys.argv[1]))
res = cv2.waitKey(0)
print 'You pressed %d (0x%x), 2LSB: %d (%s)' % (res, res, res % 2**16,
    repr(chr(res%256)) if res%256 < 128 else '?')

次の結果が得られます。

  • NumLockを使用したq文字:

    1048689(0x100071)、2LSB:113('q')を押しました

  • NumLockではなくCapsLockを使用してキーをエスケープします。

    131099(0x2001b)、2LSB:27('\ x1b')を押しました

  • ShiftとNumLockを使用したスペース:

    1114144(0x110020)、2LSB:32('')を押しました

  • コントロール付きの右矢印キー、NumLockがオフ:

    327507(0x4ff53)、2LSB:65363('S')を押しました

waitKeyこれが、NumLockとCapLockの状態に関係なく、の異常な動作と実際のキーを押す方法を説明するのに役立つことを願っています。ここから、次のようなことを行うのは比較的簡単です。

ctrlPressed = 0 != res & (1 << 18)

...「コントロールキー」フラグはビット19です。Shiftはビット17、CapsLockの状態はビット18、Altはビット20、NumLockはビット21です。

于 2015-11-05T21:25:10.120 に答える
4

私の場合、以下のコードは機能しません。実行すると、画像はプレスなしですぐに次のコードに進みます

import cv2
img = cv2.imread('sof.jpg') # load a dummy image
while(1):
    cv2.imshow('img',img)
    k = cv2.waitKey(33)
    if k==27:    # Esc key to stop
        break
    elif k==-1:  # normally -1 returned,so don't print it
        continue
    else:
        print k # else print its value

しかし、これは機能します:

def test_wait_key():
    lst_img_path = [
        '/home/xy/yy_face_head/face_det_test/111.png',
        '/home/xy/yy_face_head/face_det_test/222.png'
        #.....more path ...
    ]

    for f_path in lst_img_path:
        img = cv2.imread(f_path)
        cv2.imshow('tmp', img)
        c = cv2.waitKey(0) % 256

        if c == ord('a'):
            print "pressed a"
        else:
            print 'you press %s' % chr(c)

以下のように出力します。

ここに画像の説明を入力してください

于 2018-08-03T03:46:09.440 に答える
2

C ++の場合:

キーボードの文字/数字を使用する場合、より簡単な解決策は次のとおりです。

int key = cvWaitKey();

switch(key)
{
   case ((int)('a')):
   // do something if button 'a' is pressed
   break;
   case ((int)('h')):
   // do something if button 'h' is pressed
   break;
}
于 2015-06-25T10:46:41.050 に答える
2

UbuntuとC++では、文字/整数のキャストに問題がありました。cv::waitKey()%256正しいASCII値を取得するために使用する必要がありました。

于 2016-10-17T11:41:50.613 に答える
1

プログラムを一時停止して進行状況のスクリーンショットを撮りたい場合

(cv2.imshowとしましょう)

cv2.waitKey(0)「Scr」ボタン(またはその組み合わせ)を押した後も続行しますが、これを試すことができます

cv2.waitKey(0)
input('')

cv2.waitkey(0)は、imshowとinput('')で見たいものすべてを処理するのに十分な時間をプログラムに与えます。

コンソールウィンドウでEnterキーを押すのを待つようにします

これはPython3で動作します

于 2018-04-24T16:06:58.847 に答える
1

Ubuntu18、python3、opencv 3.2.0で機能する答えは、上記のものと同様です。しかし、行の変更に伴いcv2.waitKey(0)。これは、ボタンが押されるまでプログラムが待機することを意味します。

このコードを使用して、矢印ボタンのキー値を見つけました:上向き矢印(82)、下向き(84)、左向き矢印(81)、Enter(10)など。

import cv2
img = cv2.imread('sof.jpg') # load a dummy image
while(1):
    cv2.imshow('img',img)
    k = cv2.waitKey(0)
    if k==27:    # Esc key to stop
        break
    elif k==-1:  # normally -1 returned,so don't print it
        continue
    else:
        print k # else print its value
于 2020-04-28T08:28:33.030 に答える
1

別のStackOverflowスレッドのcv2.waitKeyEx()この回答で説明されているように、興味深いことに誰も言及していません。OpenCVのドキュメントは次のようにcv2.waitKeyEx()読み取られます。

waitKeyに似ていますが、完全なキーコードを返します。

ノート

キーコードは実装固有であり、使用するバックエンドによって異なります:QT / GTK / Win32 / etc

そのため、クロスプラットフォームの実装には注意が必要な場合があります。しかし、私にとってこれは、Windowsで矢印キーなどを機能させるための最も簡単で簡単なソリューションでした。

于 2021-03-10T22:18:57.317 に答える
0

私もこの困惑を見つけました。Ubuntu 18を実行していて、次のことがわかりました。cv.imshowウィンドウにフォーカスがある場合、ターミナルに1セットの値が表示されます(上記のASCII値のように)。

ターミナルにフォーカスがある場合は、さまざまな値が表示されます。IE-キーを押すと(ASCII値97ではなく)「a」が表示され、Escapeを押すと「27」ではなく「^]」が表示されます。

どちらの場合も、上記の6桁の数字は表示されず、同様のコードを使用しました。waitKeyの値は、mS単位のポーリング期間のようです。点はこれを示しています。

このスニペットを実行し、テスト画像にフォーカスがあるときにキーを押してから、ターミナルウィンドウをクリックして同じキーを押します。

    import cv2
    img = cv2.imread('test.jpg') 
    cv2.imshow('Your test image', img)

    while(1):
      k = cv2.waitKey(300)
      if k == 27:
        break
      elif k==-1:
       print "."
       continue
      else:
        print k 
于 2019-05-22T18:26:52.833 に答える
0

これにより、キーの組み合わせが画像に直接印刷されます。

zが押したctrl+zが押された

最初のウィンドウは'z'押された状態を示し、2番目のウィンドウは押された状態を示します'ctrl' + 'z'。キーの組み合わせを使用すると、疑問符が表示されます。

疑問符のコードを台無しにしないでください63

import numpy as np
import cv2

im = np.zeros((100, 300), np.uint8)
cv2.imshow('Keypressed', im)
while True:
  key = cv2.waitKey(0)
  im_c = im.copy()
  cv2.putText(
    im_c,
    f'{chr(key)} -> {key}',
    (10, 60), 
    cv2.FONT_HERSHEY_SIMPLEX, 
    1,
    (255,255,255),
    2)
  cv2.imshow('Keypressed', im_c)
  if key == 27: break # 'ESC'
于 2020-04-13T13:24:58.130 に答える
-1

これは私にとって最適です:

http://www.asciitable.com/

時にはそれが最良の単純な答えです;+)

于 2019-05-07T03:45:59.410 に答える