Подтвердить что ты не робот

Использование других ключей для функции waitKey() opencv

Я работаю над программой (python, opencv), в которой я использую spacebar для перехода к следующему кадру и Esc для выхода из программы. Это единственные два ключа, с которыми я работаю. Я попытался узнать больше о ключах, попробовал разные коды для них, но не работал. особенно клавиши со стрелками.

Я нашел этот о waitkey, но он не работает.

Итак, мой вопрос: как мне улавливать другие ключи помимо Esc и spacebar для запуска определенных функций в моей программе python-opencv?

4b9b3361

Ответ 1

Вы можете использовать для этого функцию ord() в Python.

Например, если вы хотите вызвать нажатие клавиши "a", сделайте следующее:

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

См. пример кода здесь: Рисование гистограммы

ОБНОВЛЕНИЕ:

Чтобы найти ключевое значение для любого ключа, нужно напечатать значение ключа с помощью простого script следующим образом:

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 :)

Ответ 2

Коды клавиш, возвращаемые waitKey, зависят от платформы. Тем не менее, это может быть очень воспитательно, чтобы увидеть, что ключи возвращают (и, кстати, на моей платформе Esc не возвращает 27...)

Целые числа, ответы на списки ответов Abid бесполезны для человеческого разума (если только вы не провидец...). Однако, если вы изучите их в шестнадцатеричной форме, или взгляните на младший байт, вы можете заметить шаблоны...

Мой script для проверки возвращаемых значений из 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 letter:

    Вы нажали 1048689 (0x100071), LSB: 113 ('q')

  • Кнопка Escape (традиционно ASCII 27):

    Вы нажали 1048603 (0x10001b), LSB: 27 ('\ x1b')

  • Space:

    Вы нажали 1048608 (0x100020), LSB: 32 ('')

Этот список может продолжаться, однако вы видите путь, когда получаете странные результаты.

Кстати, если вы хотите поместить его в цикл, вы можете просто waitKey(0) (ждать вечно) вместо игнорирования возвращаемого значения -1.

Ответ 3

Ответы, которые уже были опубликованы, показывают, что некоторые из необычных значений, полученных с помощью waitKey, объясняются различиями в платформе. Ниже я предлагаю (по крайней мере, на некоторых платформах), по-видимому, странное поведение waitKey обусловлено модификаторами клавиатуры. Это сообщение похоже на ответ Томаша, потому что я изначально написал это как редактирование, которое было отклонено.


Коды клавиш, возвращаемые waitKey, изменяются в зависимости от того, какие модификаторы включены. Клавиши NumLock, CapsLock и Shift, Ctrl и Alt изменяют код ключа, возвращаемый waitKey, путем включения определенных бит над двумя наименее значимыми байтами. Самый маленький из этих флагов - Shift в 0x10000.

Ниже приведена измененная версия script 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 '?')

Что дает следующие результаты:

  • q письмо с NumLock:

    Вы нажали 1048689 (0x100071), 2LSB: 113 ('q')

  • Клавиша Escape с CapsLock, но не NumLock:

    Вы нажали 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. Сдвиг находится в бит 17, состояние CapsLock в бит 18, Alt - в бит 20, а NumLock - в бит 21.

Ответ 4

Для С++:

В случае использования клавиатурных символов/номеров проще:

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;
}

Ответ 5

С Ubuntu и С++ у меня были проблемы с литой Character/Integer. Мне нужно было использовать cv::waitKey()%256 для получения правильного значения ASCII.

Ответ 6

Если вы хотите приостановить программу, чтобы сделать скриншоты прогресса

(показано в скажем cv2.imshow)

cv2.waitKey(0) продолжится после нажатия кнопки "Scr" (или ее комбинации), но вы можете попробовать это

cv2.waitKey(0)
input('')

cv2.waitkey(0), чтобы дать программе достаточно времени для обработки всего, что вы хотите увидеть в imshow и ввода ('')

чтобы заставить вас ждать нажатия Enter в окне консоли

это работает на питоне 3

Ответ 7

Что касается меня, приведенный ниже код не работает, при запуске изображение быстро перейдет к следующему без вашего нажатия:

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)

Вывод, как показано ниже:

enter image description here

Ответ 8

Это работает лучше всего для меня:

http://www.asciitable.com/

Иногда это простые ответы, которые являются лучшими; +)

Ответ 9

Я тоже нашел это озадачивающим. Я запускаю Ubuntu 18 и обнаружил следующее: если окно cv.imshow имеет фокус, вы получите один набор значений в терминале - как значения ASCII, описанные выше.

Если у Терминала есть фокус, вы увидите разные значения. IE- вы увидите "a" при нажатии клавиши a (вместо значения ASCII 97) и "^]" вместо "27" при нажатии Escape.

Я не видел 6 цифр, упомянутых выше, ни в одном случае, и я использовал похожий код. Кажется, значение для waitKey - это период опроса в мс. Точки иллюстрируют это.

Запустите этот фрагмент и нажмите клавиши, когда фокус находится на тестовом изображении, затем нажмите на окно терминала и нажмите те же клавиши.

    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