2013-01-24 29 views
26

Tôi đang làm việc trên một chương trình (python, opencv) trong đó tôi sử dụng spacebar để chuyển đến khung tiếp theo và Esc để thoát khỏi chương trình. Đây là hai phím duy nhất tôi đã làm việc. Tôi đã cố gắng tìm hiểu thêm về các khóa, đã thử các mã khác nhau cho chúng nhưng không hoạt động. đặc biệt là các phím mũi tên.Sử dụng các phím khác cho chức năng waitKey() của opencv

Tôi tìm thấy this về waitkey, nhưng nó không hoạt động.

Vì vậy, câu hỏi của tôi là, Làm thế nào để nắm bắt các phím khác ngoài escspacebar để kích hoạt một số chức năng trong chương trình python-opencv của tôi?

Trả lời

42

Bạn có thể sử dụng chức năng ord() bằng Python cho điều đó.

Ví dụ, nếu bạn muốn kích hoạt 'a' nhấn phím, làm như sau:

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

Xem mẫu mã ở đây: Drawing Histogram

UPDATE:

Để tìm giá trị khóa cho bất kỳ khóa nào là in giá trị khóa bằng cách sử dụng một tập lệnh đơn giản như sau:

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 

Với mã này, tôi có giá trị sau:

Upkey : 2490368 
DownKey : 2621440 
LeftKey : 2424832 
RightKey: 2555904 
Space : 32 
Delete : 3014656 
...... # Continue yourself :) 
+0

Cảm ơn @Abid, Tính năng này hoạt động với hầu hết các phím, Làm cách nào để sử dụng phím mũi tên? – md1hunox

+0

đã cập nhật câu trả lời @vineetrok –

+0

Tôi không nhận được bất kỳ số nào cho các phím mũi tên trên OSX – mirosval

14

Các mã phím được trả về bởi waitKey dường như nền tảng phụ thuộc. Tuy nhiên, nó có thể rất giáo dục, để xem những gì các phím trở (và bằng cách này, trên nền tảng của tôi, Esc không trả lại 27 ...)

Các số nguyên Thầy danh sách câu trả lời của Abid là Mosty vô dụng với tâm trí con người (trừ khi bạn là một thần đồng ...). Tuy nhiên, nếu bạn kiểm tra chúng trong hex, hoặc hãy nhìn vào byte thấp, bạn có thể nhận thấy mô hình ...

Kịch bản của tôi để kiểm tra các giá trị trở về từ waitKey được dưới đây:

#!/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 '?') 

Bạn có thể sử dụng nó như một trình xem hình ảnh dòng lệnh tối thiểu.

Một số kết quả, mà tôi nhận được: thư

  • q:

    Bạn đã nhấn 1.048.689 (0x100071), LSB: 113 ('q')

  • phím Escape (theo truyền thống, ASCII 27):

    Bạn đã nhấn 1048603 (0x10001b), LSB: 27 ('\ x1b')

  • Space:

    Bạn đã nhấn 1.048.608 (0x100020), LSB: 32 (' ')

Danh sách này có thể tiếp tục, tuy nhiên bạn thấy con đường để đi, khi bạn nhận được 'kết quả kỳ lạ' .

BTW, nếu bạn muốn đặt trong vòng lặp, bạn chỉ có thể waitKey(0) (chờ mãi), thay vì bỏ qua giá trị trả về -1.

+3

Sự phụ thuộc nền tảng có vẻ như là một vấn đề số nguyên/không dấu. Nó phải được giải quyết dễ dàng bằng cách sử dụng các thao tác bit, ví dụ 'res = cv2.waitkey() & 0xEFFFFF'. – billyjmc

0

Đối với C++:

Trong trường hợp sử dụng ký tự bàn phím/số, một giải pháp dễ dàng hơn sẽ là:

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

Những câu trả lời đã được đăng tải gợi ý rằng một số các giá trị bất thường thu được bằng cách waitKey là do sự khác biệt nền tảng. Dưới đây, tôi đề nghị rằng (ít nhất là trên một số nền tảng) hành vi dường như kỳ quặc của waitKey là do bộ sửa đổi bàn phím. Bài đăng này trông giống như câu trả lời của Tomasz vì ban đầu tôi đã viết bài này như một bản chỉnh sửa, đã bị từ chối.


Mã khóa được trả về theo số waitKey thay đổi tùy thuộc vào công cụ sửa đổi nào được bật. Các phím NumLock, CapsLock và Shift, Ctrl và Alt đều sửa đổi mã khóa được trả lại bằng waitKey bằng cách bật các bit nhất định trên hai byte đáng kể ít nhất. Nhỏ nhất trong số các cờ này là Shift ở 0x10000.

Một phiên bản sửa đổi của kịch bản Tomasz gửi được đưa ra dưới đây:

#!/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 '?') 

nào cho kết quả như sau:

  • q thư với NumLock:

    Bạn đã nhấn 1.048.689 (0x100071), 2LSB: 113 ('q')

  • Phím thoát với Caps Khóa nhưng không NumLock:

    Bạn đã nhấn 131.099 (0x2001b), 2LSB: 27 ('\ x1b')

  • Space với Shift và NumLock:

    Bạn đã nhấn 1.114.144 (0x110020), 2LSB: 32 (' ')

  • phải phím mũi tên với kiểm soát, NumLock off:

    Bạn đã nhấn 327.507 (0x4ff53), 2LSB: 65.363 (' S')

Tôi hy vọng rằng sẽ giúp giải thích các hành vi bất thường của waitKey và cách nhận được khóa thực tế được nhấn bất kể trạng thái của NumLock và CapLock. Từ đây nó tương đối đơn giản để làm một cái gì đó như:

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

... là "kiểm soát chính" cờ là chút 19. Shift là tại chút 17, trạng thái CapsLock tại 18 bit, Alt là 20 bit , và NumLock là bit 21.

+1

Wow, Vì vậy, nó đã được về các modifiers ... Nice, tôi gần như không bao giờ tắt NumLock Side lưu ý: nó đôi khi thuận tiện hơn để đếm bit từ 0 - tức là Shift là bit 16 (và mặt nạ là '(1 << 16)' Ngoài ra - chỉ cần nhấn Shift cũng trả về một giá trị - LShift là '0xffe1' và RShift' 0xffe2'. –

0

Với Ubuntu và C++, tôi gặp sự cố với tính năng Ký tự/Số nguyên. Tôi cần sử dụng cv::waitKey()%256 để có được giá trị ASCII chính xác.

Các vấn đề liên quan