Skip to content

Instantly share code, notes, and snippets.

@johanjohan
Created October 9, 2021 17:14
Show Gist options
  • Save johanjohan/b58d37f10ea7012e57eac61f781cb3eb to your computer and use it in GitHub Desktop.
Save johanjohan/b58d37f10ea7012e57eac61f781cb3eb to your computer and use it in GitHub Desktop.
cv2 extra key binding: arrows etc
import numpy as np
from py3j.system import system as m_system
"""
https://stackoverflow.com/questions/45580975/opencv-handling-arrow-keys-with-waitkey-function/45584477
https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
in main:
cv2_key = cv2.waitKeyEx( 1 ) & m_cv2.Key.mask
if cv2_key != m_cv2.Key.mask:
if cv2_key == m_cv2.Key.VK_DOWN:
# do something
elif cv2_key == m_cv2.Key.VK_UP:
# do something
"""
class Key:
mask = 0xFFFFFF # so up arrow key maps to 0x260000 VK_UP
# https://help.perforce.com/pv-wave/2017.1/PVWAVE_Online_Help/pvwave.html#page/Foundation/ap.e.virt_keys.html
# copied into excel vk_codes_2.xlsx
VK_ABNT_C1 = 0xC10000 # 0xC1 0xC10000 # Abnt C1
VK_ABNT_C2 = 0xC20000 # 0xC2 0xC20000 # Abnt C2
VK_ADD = 0x6B0000 # 0x6B 0x6B0000 # Numpad +
VK_ATTN = 0xF60000 # 0xF6 0xF60000 # Attn
VK_BACK = 0x80000 # 0x08 0x80000 # Backspace
VK_CANCEL = 0x30000 # 0x03 0x30000 # Break
VK_CLEAR = 0xC0000 # 0x0C 0xC0000 # Clear
VK_CRSEL = 0xF70000 # 0xF7 0xF70000 # Cr Sel
VK_DECIMAL = 0x6E0000 # 0x6E 0x6E0000 # Numpad .
VK_DIVIDE = 0x6F0000 # 0x6F 0x6F0000 # Numpad /
VK_EREOF = 0xF90000 # 0xF9 0xF90000 # Er Eof
VK_ESCAPE = 0x1B0000 # 0x1B 0x1B0000 # Esc
VK_EXECUTE = 0x2B0000 # 0x2B 0x2B0000 # Execute
VK_EXSEL = 0xF80000 # 0xF8 0xF80000 # Ex Sel
VK_ICO_CLEAR = 0xE60000 # 0xE6 0xE60000 # IcoClr
VK_ICO_HELP = 0xE30000 # 0xE3 0xE30000 # IcoHlp
VK_KEY_0 = 0x300000 # 0x30 0x300000 # ('0') 0
VK_KEY_1 = 0x310000 # 0x31 0x310000 # ('1') 1
VK_KEY_2 = 0x320000 # 0x32 0x320000 # ('2') 2
VK_KEY_3 = 0x330000 # 0x33 0x330000 # ('3') 3
VK_KEY_4 = 0x340000 # 0x34 0x340000 # ('4') 4
VK_KEY_5 = 0x350000 # 0x35 0x350000 # ('5') 5
VK_KEY_6 = 0x360000 # 0x36 0x360000 # ('6') 6
VK_KEY_7 = 0x370000 # 0x37 0x370000 # ('7') 7
VK_KEY_8 = 0x380000 # 0x38 0x380000 # ('8') 8
VK_KEY_9 = 0x390000 # 0x39 0x390000 # ('9') 9
VK_KEY_A = 0x410000 # 0x41 0x410000 # ('A') A
VK_KEY_B = 0x420000 # 0x42 0x420000 # ('B') B
VK_KEY_C = 0x430000 # 0x43 0x430000 # ('C') C
VK_KEY_D = 0x440000 # 0x44 0x440000 # ('D') D
VK_KEY_E = 0x450000 # 0x45 0x450000 # ('E') E
VK_KEY_F = 0x460000 # 0x46 0x460000 # ('F') F
VK_KEY_G = 0x470000 # 0x47 0x470000 # ('G') G
VK_KEY_H = 0x480000 # 0x48 0x480000 # ('H') H
VK_KEY_I = 0x490000 # 0x49 0x490000 # ('I') I
VK_KEY_J = 0x4A0000 # 0x4A 0x4A0000 # ('J') J
VK_KEY_K = 0x4B0000 # 0x4B 0x4B0000 # ('K') K
VK_KEY_L = 0x4C0000 # 0x4C 0x4C0000 # ('L') L
VK_KEY_M = 0x4D0000 # 0x4D 0x4D0000 # ('M') M
VK_KEY_N = 0x4E0000 # 0x4E 0x4E0000 # ('N') N
VK_KEY_O = 0x4F0000 # 0x4F 0x4F0000 # ('O') O
VK_KEY_P = 0x500000 # 0x50 0x500000 # ('P') P
VK_KEY_Q = 0x510000 # 0x51 0x510000 # ('Q') Q
VK_KEY_R = 0x520000 # 0x52 0x520000 # ('R') R
VK_KEY_S = 0x530000 # 0x53 0x530000 # ('S') S
VK_KEY_T = 0x540000 # 0x54 0x540000 # ('T') T
VK_KEY_U = 0x550000 # 0x55 0x550000 # ('U') U
VK_KEY_V = 0x560000 # 0x56 0x560000 # ('V') V
VK_KEY_W = 0x570000 # 0x57 0x570000 # ('W') W
VK_KEY_X = 0x580000 # 0x58 0x580000 # ('X') X
VK_KEY_Y = 0x590000 # 0x59 0x590000 # ('Y') Y
VK_KEY_Z = 0x5A0000 # 0x5A 0x5A0000 # ('Z') Z
VK_MULTIPLY = 0x6A0000 # 0x6A 0x6A0000 # Numpad *
VK_NONAME = 0xFC0000 # 0xFC 0xFC0000 # NoName
VK_NUMPAD0 = 0x600000 # 0x60 0x600000 # Numpad 0
VK_NUMPAD1 = 0x610000 # 0x61 0x610000 # Numpad 1
VK_NUMPAD2 = 0x620000 # 0x62 0x620000 # Numpad 2
VK_NUMPAD3 = 0x630000 # 0x63 0x630000 # Numpad 3
VK_NUMPAD4 = 0x640000 # 0x64 0x640000 # Numpad 4
VK_NUMPAD5 = 0x650000 # 0x65 0x650000 # Numpad 5
VK_NUMPAD6 = 0x660000 # 0x66 0x660000 # Numpad 6
VK_NUMPAD7 = 0x670000 # 0x67 0x670000 # Numpad 7
VK_NUMPAD8 = 0x680000 # 0x68 0x680000 # Numpad 8
VK_NUMPAD9 = 0x690000 # 0x69 0x690000 # Numpad 9
VK_OEM_1 = 0xBA0000 # 0xBA 0xBA0000 # OEM_1 (:
VK_OEM_102 = 0xE20000 # 0xE2 0xE20000 # OEM_102 (>
VK_OEM_2 = 0xBF0000 # 0xBF 0xBF0000 # OEM_2 (?
VK_OEM_3 = 0xC00000 # 0xC0 0xC00000 # OEM_3 (~
VK_OEM_4 = 0xDB0000 # 0xDB 0xDB0000 # OEM_4 ({
VK_OEM_5 = 0xDC0000 # 0xDC 0xDC0000 # OEM_5 (|
VK_OEM_6 = 0xDD0000 # 0xDD 0xDD0000 # OEM_6 (}
VK_OEM_7 = 0xDE0000 # 0xDE 0xDE0000 # OEM_7 ("
VK_OEM_8 = 0xDF0000 # 0xDF 0xDF0000 # OEM_8 (§
VK_OEM_ATTN = 0xF00000 # 0xF0 0xF00000 # Oem Attn
VK_OEM_AUTO = 0xF30000 # 0xF3 0xF30000 # Auto
VK_OEM_AX = 0xE10000 # 0xE1 0xE10000 # Ax
VK_OEM_BACKTAB = 0xF50000 # 0xF5 0xF50000 # Back Tab
VK_OEM_CLEAR = 0xFE0000 # 0xFE 0xFE0000 # OemClr
VK_OEM_COMMA = 0xBC0000 # 0xBC 0xBC0000 # OEM_COMMA (<
VK_OEM_COPY = 0xF20000 # 0xF2 0xF20000 # Copy
VK_OEM_CUSEL = 0xEF0000 # 0xEF 0xEF0000 # Cu Sel
VK_OEM_ENLW = 0xF40000 # 0xF4 0xF40000 # Enlw
VK_OEM_FINISH = 0xF10000 # 0xF1 0xF10000 # Finish
VK_OEM_FJ_LOYA = 0x950000 # 0x95 0x950000 # Loya
VK_OEM_FJ_MASSHOU = 0x930000 # 0x93 0x930000 # Mashu
VK_OEM_FJ_ROYA = 0x960000 # 0x96 0x960000 # Roya
VK_OEM_FJ_TOUROKU = 0x940000 # 0x94 0x940000 # Touroku
VK_OEM_JUMP = 0xEA0000 # 0xEA 0xEA0000 # Jump
VK_OEM_MINUS = 0xBD0000 # 0xBD 0xBD0000 # OEM_MINUS (_
VK_OEM_PA1 = 0xEB0000 # 0xEB 0xEB0000 # OemPa1
VK_OEM_PA2 = 0xEC0000 # 0xEC 0xEC0000 # OemPa2
VK_OEM_PA3 = 0xED0000 # 0xED 0xED0000 # OemPa3
VK_OEM_PERIOD = 0xBE0000 # 0xBE 0xBE0000 # OEM_PERIOD (>
VK_OEM_PLUS = 0xBB0000 # 0xBB 0xBB0000 # OEM_PLUS (+
VK_OEM_RESET = 0xE90000 # 0xE9 0xE90000 # Reset
VK_OEM_WSCTRL = 0xEE0000 # 0xEE 0xEE0000 # WsCtrl
VK_PA1 = 0xFD0000 # 0xFD 0xFD0000 # Pa1
VK_PACKET = 0xE70000 # 0xE7 0xE70000 # Packet
VK_PLAY = 0xFA0000 # 0xFA 0xFA0000 # Play
VK_PROCESSKEY = 0xE50000 # 0xE5 0xE50000 # Process
VK_RETURN = 0xD0000 # 0x0D 0xD0000 # Enter
VK_SELECT = 0x290000 # 0x29 0x290000 # Select
VK_SEPARATOR = 0x6C0000 # 0x6C 0x6C0000 # Separator
VK_SPACE = 0x200000 # 0x20 0x200000 # Space
VK_SUBTRACT = 0x6D0000 # 0x6D 0x6D0000 # Num -
VK_TAB = 0x90000 # 0x09 0x90000 # Tab
VK_ZOOM = 0xFB0000 # 0xFB 0xFB0000 # Zoom
VK__none_ = 0xFF0000 # 0xFF 0xFF0000 # no VK
VK_ACCEPT = 0x1E0000 # 0x1E 0x1E0000 # Accept
VK_APPS = 0x5D0000 # 0x5D 0x5D0000 # Context Menu
VK_BROWSER_BACK = 0xA60000 # 0xA6 0xA60000 # Browser Back
VK_BROWSER_FAVORITES = 0xAB0000 # 0xAB 0xAB0000 # Browser Favorites
VK_BROWSER_FORWARD = 0xA70000 # 0xA7 0xA70000 # Browser Forward
VK_BROWSER_HOME = 0xAC0000 # 0xAC 0xAC0000 # Browser Home
VK_BROWSER_REFRESH = 0xA80000 # 0xA8 0xA80000 # Browser Refresh
VK_BROWSER_SEARCH = 0xAA0000 # 0xAA 0xAA0000 # Browser Search
VK_BROWSER_STOP = 0xA90000 # 0xA9 0xA90000 # Browser Stop
VK_CAPITAL = 0x140000 # 0x14 0x140000 # Caps Lock
VK_CONVERT = 0x1C0000 # 0x1C 0x1C0000 # Convert
VK_DELETE = 0x2E0000 # 0x2E 0x2E0000 # Delete
VK_DOWN = 0x280000 # 0x28 0x280000 # Arrow Down
VK_END = 0x230000 # 0x23 0x230000 # End
VK_F1 = 0x700000 # 0x70 0x700000 # F1
VK_F10 = 0x790000 # 0x79 0x790000 # F10
VK_F11 = 0x7A0000 # 0x7A 0x7A0000 # F11
VK_F12 = 0x7B0000 # 0x7B 0x7B0000 # F12
VK_F13 = 0x7C0000 # 0x7C 0x7C0000 # F13
VK_F14 = 0x7D0000 # 0x7D 0x7D0000 # F14
VK_F15 = 0x7E0000 # 0x7E 0x7E0000 # F15
VK_F16 = 0x7F0000 # 0x7F 0x7F0000 # F16
VK_F17 = 0x800000 # 0x80 0x800000 # F17
VK_F18 = 0x810000 # 0x81 0x810000 # F18
VK_F19 = 0x820000 # 0x82 0x820000 # F19
VK_F2 = 0x710000 # 0x71 0x710000 # F2
VK_F20 = 0x830000 # 0x83 0x830000 # F20
VK_F21 = 0x840000 # 0x84 0x840000 # F21
VK_F22 = 0x850000 # 0x85 0x850000 # F22
VK_F23 = 0x860000 # 0x86 0x860000 # F23
VK_F24 = 0x870000 # 0x87 0x870000 # F24
VK_F3 = 0x720000 # 0x72 0x720000 # F3
VK_F4 = 0x730000 # 0x73 0x730000 # F4
VK_F5 = 0x740000 # 0x74 0x740000 # F5
VK_F6 = 0x750000 # 0x75 0x750000 # F6
VK_F7 = 0x760000 # 0x76 0x760000 # F7
VK_F8 = 0x770000 # 0x77 0x770000 # F8
VK_F9 = 0x780000 # 0x78 0x780000 # F9
VK_FINAL = 0x180000 # 0x18 0x180000 # Final
VK_HELP = 0x2F0000 # 0x2F 0x2F0000 # Help
VK_HOME = 0x240000 # 0x24 0x240000 # Home
VK_ICO_00 = 0xE40000 # 0xE4 0xE40000 # Ico00 *
VK_INSERT = 0x2D0000 # 0x2D 0x2D0000 # Insert
VK_JUNJA = 0x170000 # 0x17 0x170000 # Junja
VK_KANA = 0x150000 # 0x15 0x150000 # Kana
VK_KANJI = 0x190000 # 0x19 0x190000 # Kanji
VK_LAUNCH_APP1 = 0xB60000 # 0xB6 0xB60000 # App1
VK_LAUNCH_APP2 = 0xB70000 # 0xB7 0xB70000 # App2
VK_LAUNCH_MAIL = 0xB40000 # 0xB4 0xB40000 # Mail
VK_LAUNCH_MEDIA_SELECT = 0xB50000 # 0xB5 0xB50000 # Media
VK_LBUTTON = 0x10000 # 0x01 0x10000 # Left Button
VK_LCONTROL = 0xA20000 # 0xA2 0xA20000 # Left Ctrl
VK_LEFT = 0x250000 # 0x25 0x250000 # Arrow Left
VK_LMENU = 0xA40000 # 0xA4 0xA40000 # Left Alt
VK_LSHIFT = 0xA00000 # 0xA0 0xA00000 # Left Shift
VK_LWIN = 0x5B0000 # 0x5B 0x5B0000 # Left Win
VK_MBUTTON = 0x40000 # 0x04 0x40000 # Middle Button
VK_MEDIA_NEXT_TRACK = 0xB00000 # 0xB0 0xB00000 # Next Track
VK_MEDIA_PLAY_PAUSE = 0xB30000 # 0xB3 0xB30000 # Play /
VK_MEDIA_PREV_TRACK = 0xB10000 # 0xB1 0xB10000 # Previous Track
VK_MEDIA_STOP = 0xB20000 # 0xB2 0xB20000 # Stop
VK_MODECHANGE = 0x1F0000 # 0x1F 0x1F0000 # Mode Change
VK_NEXT = 0x220000 # 0x22 0x220000 # Page Down
VK_NONCONVERT = 0x1D0000 # 0x1D 0x1D0000 # Non Convert
VK_NUMLOCK = 0x900000 # 0x90 0x900000 # Num Lock
VK_OEM_FJ_JISHO = 0x920000 # 0x92 0x920000 # Jisho
VK_PAUSE = 0x130000 # 0x13 0x130000 # Pause
VK_PRINT = 0x2A0000 # 0x2A 0x2A0000 # Print
VK_PRIOR = 0x210000 # 0x21 0x210000 # Page Up
VK_RBUTTON = 0x20000 # 0x02 0x20000 # Right Button
VK_RCONTROL = 0xA30000 # 0xA3 0xA30000 # Right Ctrl
VK_RIGHT = 0x270000 # 0x27 0x270000 # Arrow Right
VK_RMENU = 0xA50000 # 0xA5 0xA50000 # Right Alt
VK_RSHIFT = 0xA10000 # 0xA1 0xA10000 # Right Shift
VK_RWIN = 0x5C0000 # 0x5C 0x5C0000 # Right Win
VK_SCROLL = 0x910000 # 0x91 0x910000 # Scrol Lock
VK_SLEEP = 0x5F0000 # 0x5F 0x5F0000 # Sleep
VK_SNAPSHOT = 0x2C0000 # 0x2C 0x2C0000 # Print Screen
VK_UP = 0x260000 # 0x26 0x260000 # Arrow Up
VK_VOLUME_DOWN = 0xAE0000 # 0xAE 0xAE0000 # Volume Down
VK_VOLUME_MUTE = 0xAD0000 # 0xAD 0xAD0000 # Volume Mute
VK_VOLUME_UP = 0xAF0000 # 0xAF 0xAF0000 # Volume Up
VK_XBUTTON1 = 0x50000 # 0x05 0x50000 # X Button
VK_XBUTTON2 = 0x60000 # 0x06 0x60000 # X Button
"""
geiger_bulb._master_brightness = m_cv2.Key.step(
geiger_bulb._master_brightness, cv2_key, m_cv2.Key.VK_UP, m_cv2.Key.VK_DOWN, 1/10, True, 0, 1
)
"""
def step(value, cv2_key, key_up, key_down, step, b_clamp, value_min, value_max):
if cv2_key == key_up:
value += step
elif cv2_key == key_down:
value -= step
if b_clamp:
value = np.clip(value, value_min, value_max)
print(m_system.func(), "{:.6f}".format(value))
return value
### class Key ###
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment