opencv

2013-01-24 23 views
26

waitKey() işlevi için diğer anahtarları kullanıyorum spacebar'u sonraki kareye gitmek için kullandığım bir program (python, opencv) üzerinde çalışıyorum ve programdan çıkmak için Esc. Bunlar çalıştığım sadece iki anahtar. Daha fazla anahtar bulmaya çalıştım, onlar için çeşitli kodları denedim ama işe yaramadı. özellikle ok tuşları.opencv

waitkey ile ilgili buldum, ancak çalışmıyor.

Benim sorum şu ki, python-opencv programımdaki bazı işlevleri tetiklemek için esc ve spacebar dışındaki diğer anahtarları nasıl yakalarım?

cevap

42

Bunun için Python'da ord() işlevini kullanabilirsiniz. Örneğin

, aşağıdaki gibi, 'a' tuşuna basın tetiklemek istiyorum yaparsanız: Drawing Histogram

GÜNCELLEME:

bulmak için

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

burada örnek kod bakın Herhangi bir tuşun anahtar değeri, aşağıdaki gibi basit bir betik kullanarak anahtar değerini basmaktır: tarafından döndürülen

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

Teşekkürler @Abid, Bu anahtarların çoğunda çalışır, Ok Tuşlarını nasıl kullanırım? – md1hunox

+0

cevabı güncelleştirildi @vineetrok –

+0

OSX'deki ok tuşları için bir sayı alamıyorum – mirosval

14

tuş kodlarına platformu bağımlı görünüyor: Bu kod ile , ben aşağıdaki değerleri var. Ancak , bu

tamsayılar thay Abid cevabı listeleri yararsız mosty vardır (... ve bu arada, benim platformunda, Esc 27 döndürmüyor) tuşları dönmek görmek için çok eğitici olabilir insan aklı için (siz bir sağduyulu değilseniz ...). Eğer onaltılık, bunları incelemek veya en az belirgin Byte bakmak Ancak, sen ... desenleri görebilirsiniz

waitKey dönüş değerlerini incelemek için My komut dosyası aşağıda olduğu:

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

Minimal, komut satırı görüntüleyici olarak kullanabilirsiniz.

  • q harfi: bende

    bazı sonuçlar, Sen 1048689 preslenmiş

    (0x100071), LSB: 113 ('q')

  • Kaçış tuşu (geleneksel olarak, ASCII 27):

    Sen 1048603 (0x10001b preslenmiş), LSB: 27 ('\ X1B')

  • Alanı:

    Sen preslenmiş 1048608 (0x100020), LSB: 32 (' ')

Bu liste gidebiliriz, ancak sen alınca, gitmeye şekilde görmek 'garip' sonuçları .

BTW, bir döngüye koymak istiyorsanız, -1 dönüş değerini göz ardı etmek yerine, yalnızca waitKey(0) (bekle). C++ için

+3

Platform bağımlılığı imzalı/imzasız bir tamsayı problemi gibi görünüyor. Bitwise işlemleri kullanılarak kolayca çözülmelidir, örneğin; res = cv2.waitkey() & 0xEFFFFF. – billyjmc

0

:

klavye karakterlerini/numaralarının kullanılması durumunda daha kolay bir çözüm olacaktır:

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

önceden gönderilmiş cevapları sıradışı değerlerinden bazılarını waitKey ile elde düşündürmektedir Platform farklılıkları nedeniyle. Aşağıda, (en azından bazı platformlarda) waitKey'un görünüşte tuhaf davranışının klavye değiştiricilerinden kaynaklandığını öneriyorum. Bu yazı Tomasz'in cevabına benziyor, çünkü bunu başlangıçta reddedilen bir düzenleme olarak yazdım.


tuş kodlarına waitKey değişim düzenleyiciler etkin olduğuna bağlı tarafından döndürülen. NumLock, CapsLock ve Shift, Ctrl ve Alt tuşlarının tümü, iki En Önemli Anlamlı Baytın üstünde belirli bitleri etkinleştirerek waitKey tarafından döndürülen anahtar kodunu değiştirir. Bu bayrakların en küçüğü 0x10000’de Shift’tir.

Tomasz yayınlanan script modifiye edilmiş versiyonu aşağıda verilmiştir: NumLock'u ile

  • q harfi: Aşağıdaki sonuçlar elde

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

    Sen 1048689 preslenmiş (0x100071), 2LSB: 113 ('q')

  • Caps ile Escape tuşu Kilit ancak NumLock: 27 ('\ X1B') Shift ve NumLock'u ile

  • Uzay:

    Sen preslenmiş 1114144 (0x110020), 2LSB: 32

    Sen 131099 (0x2001b), 2LSB preslenmiş (' ') Kontrol, NumLock'u kapalı olarak

  • sağ ok tuşu:

    Sen preslenmiş 327507 (0x4ff53), 2LSB: 65363 (' S')

Umarım bu, waitKey alışılmadık davranışını açıklamaya yardımcı olur ve NumLock ve CapLock durumundan bağımsız olarak gerçek tuşa nasıl basılır. Buradan da böyle bir şey yapmak nispeten basit: olarak

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

... "kontrol tuşu" bayrak 19. Shift bit 17 olan bit, bit 18 CapsLock devlet, Alt bit 20 olduğunu ve NumLock birazda 21.

+1

Wow, bu yüzden değiştiriciler hakkındaydı ... Güzel, neredeyse hiçbir zaman NumLock'ı kapatmayacağım .. Yan not: bazen 0'dan bit saymak daha uygun olur - yani Shift 16 bit (ve maske ise (1 << 16) 'dır Ayrıca - sadece Shift'e basmak da bir değer döndürür - LShift '0xffe1' ve RShift' 0xffe2''dir. –

0

Ubuntu ve C++ ile Karakter/Tamsayı kadrosuyla ilgili sorunlar yaşadım. Doğru ASCII değerini elde etmek için cv::waitKey()%256 kullanmam gerekiyordu.