OpenCV'nin cvWaitKey () işlevi ne yapar?


82

İnfaz sırasında ne olur cvWaitKey()? Bazı tipik kullanım durumları nelerdir? OpenCV referansında gördüm ancak dokümantasyon tam olarak amacı konusunda net değil.


3
Onun hakkında neyi anlamıyorsun ya da ne yaptığını düşünüyorsun? OpenCV dokümantasyon referansı bana çok açık görünüyor ...
Daniel Sloof

8
@ user588855 Sorularınızı gözden geçirmeniz ve buna dahil bazı cevapları kabul etmeniz hepimiz için önemlidir.
karlphillip

4
Kayıt için, cvWaitKey()artık kullanımdan kaldırılmış bir C işlevi. waitKey()modern C ++ eşdeğeridir.
Stok B

1
Cevaplardan birini işaretleyebilir misiniz (@SuperElectric 's şimdilik en iyisi gibi görünüyor), böylece soru cevaplanmış sayılabilir. 4 yıl bir cevap beklemek ve birden fazla cevap almak uzun bir süre ...
rbaleksandar

Örneğin @DanielSloof, dönüş değerlerinin hangi standardı takip ettiğini bilmek güzel olurdu.
lahjaton_j

Yanıtlar:


138

cvWaitKey(x) / cv::waitKey(x) iki şey yapar:

  1. Bir OpenCV penceresinde bir tuşa basılması için x milisaniye bekler (yani oluşturulan cv::imshow()). Konsol girişi için stdin'i dinlemediğini unutmayın. Bu süre içinde bir tuşa basılırsa, anahtarın ASCII kodunu döndürür. Aksi takdirde geri döner -1. (Eğer x sıfır ise, süresiz olarak tuşa basılmasını bekler.)
  2. İle pencere oluşturma cv::namedWindow()veya ile görüntüleri gösterme gibi pencereleme olaylarını yönetir cv::imshow().

Yeni başlayanlar için yaygın bir hata cv::imshow(), her çekilişi takip etmeden, video kareleri arasında bir döngü oluşturmaktır cv::waitKey(30). Highgui gelen beraberlik isteklerini işlemek için zaman verilmiş hiçbir zaman, çünkü bu durumda, hiçbir şey, ekranda belirir cv::imshow().


19

Basitçe, X milisaniye cvWaitKey()uyur ve herhangi bir tuşa basılmasını bekler.

int cvWaitKey(int X);

Bir tuşa basıldığında, bu işlev anahtarın ASCII kodunu döndürür. Veya bu süre içinde hiçbir tuşa basılmazsa -1 döndürür .


3
Hikayenin tamamı bu değil. Pratikte, klavye girişi umurunuzda olmasa bile, bu işlevi çağırmak bazı OpenCV uygulamaları için gerekli olabilir. Burada biraz daha bilgi var .
Drew Noakes

13

cvWaitKey(0) bir düğmeye basana kadar programınızı durdurur.

cvWaitKey(10)programınızı durdurmaz, ancak bir düğmeye bastığınızda programınızı sonlandırmak için uyanır ve uyarır. Döngülerde kullanılır çünkü cvWaitkeydöngüyü durdurmaz.

Normal kullanım

char k;

k=cvWaitKey(0);

if(k == 'ESC')

ile khangi tuşa basıldığını görebilirsiniz.


5
Ayrıca biraz daha önemlisi - bu openCV mesaj döngüsüdür. Eğer döngüde cvWaitKey () çağrısı sürece bir cvNamedWindow herhangi bir yeni veri görmezsiniz
Martin Beckett

14
Karşılaştırma yaptığım için benden -1 char? = Multichar . Bu çok yanlış. Ya yazdırılabilir karakteri kullanın (ESC yazdırılamayan bir karakter olduğu için bu durumda mümkün değildir, ancak örneğin Q tuşunu kullanmanız durumunda bir? = 'Q' karşılaştırması yapabilirsiniz) veya sayısal temsillerden birini seçin. ASCII, birden fazla sayısal sistemi destekler: onaltılık (0x1b), onluk (27) ve sekizlik (033). Listelenenlerin tümü ESC anahtarını temsil eder.
rbaleksandar

1
int değil char olmalı, sonra bit ops kullan
Vlad

@Vlad Evet, user1564486'daki gibi 27 olmalıdır
FindOutIslamNow

9

. argümanı 0olarak yorumlanırinfinite

. highGUI pencerelerini sürüklemek için sürekli olarak cv::waitKey()işlevi çağırmanız gerekir . örneğin statik görüntüler için:

cv::imshow("winname", img);

while(cv::waitKey(1) != 27); // 27 = ascii value of ESC


8

İşlevle ilgili sorunları olan herkes için not alın cvWaitKey( ). Bunun cvWaitKey(x)hiç beklemediğini görüyorsanız, aslında açık bir pencereniz olduğundan emin olun (yani cvNamedWindow(...)). cvNamedWindow(...)Bildirimi herhangi bir cvWaitKey()işlev çağrısından ÖNCE koyun .


SO'ya hoş geldiniz, sizin yaptığınız gibi bilgi göndermek için iyi bir yer. Genellikle, bir cevap gönderdiğinizde, soruya yeni bilgiler getirmesi gerekir, böylece gereksiz gönderi oluşturmaz. Gönderiniz için durum buydu. Daha küçük bir yorumunuz varsa, soruya daha sonra da yorum yapabilirsiniz (daha fazla Rep aldığınızda). Henüz okumadıysanız, SSS bölümüne bir göz atmanızı öneririm: stackoverflow.com/faq . Saygılarımızla
ForceMagic

5
/* Assuming this is a while loop -> e.g. video stream where img is obtained from say web camera.*/    
cvShowImage("Window",img);

/* A small interval of 10 milliseconds. This may be necessary to display the image correctly */
cvWaitKey(10);  

/* to wait until user feeds keyboard input replace with cvWaitKey(0); */

4

cvWaitKeyBasitçe bir gecikme şey sağlar. Örneğin:

char c = cvWaitKey(33);
if( c == 27 ) break;

Bu, bir videonun openCV'ye yüklendiği ve karelerin çıkarıldığı kodumun bir parçasıydı. Koddaki 33sayı, daha sonra 33msyeni bir çerçevenin gösterileceği anlamına gelir . Bu nedenle, 33msekranda gösterilen her kare arasında bir gün veya zaman aralığı vardı . Bu yardımcı olur umarım.


1

cvWaitKey(milliseconds) klavyenin bir sonraki tuş vuruşu için parametre olarak sağlanan milisaniyeleri bekleyin.

İnsan gözü, hareket eden şeyi 1/10 saniyeden daha kısa sürede göremez, bu yüzden bunu aynı görüntü çerçevesini bir süre ekranda tutmak için kullanırız. Klavye tuşuna basıldığı anda bir sonraki işlem gerçekleştirilecektir.

Kısaca cvWaitKey(milliseconds)tuşa basma veya verilen millisecondsüre için bekleyin .


1
"İnsan gözü hareket eden şeyi 1/10 saniyeden daha kısa sürede göremiyor, bu yüzden bunu aynı görüntü çerçevesini ekranda bir süre tutmak için kullanıyoruz. Klavye tuşuna basıldığında bir sonraki işlem gerçekleştirilecektir" bu gerçekten soru için önemli mi?
kuantum

-1

tuşa basılıp basılmadığını kontrol etmek için milisaniye bekler, bu aralıkta basılırsa ascii değerini döndürür, aksi takdirde hala -1

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.