OpenCV के cvWaitKey () फ़ंक्शन क्या करता है?


82

के निष्पादन के दौरान क्या होता है cvWaitKey()? कुछ विशिष्ट उपयोग के मामले क्या हैं? मैंने इसे OpenCV संदर्भ में देखा था लेकिन प्रलेखन अपने सटीक उद्देश्य पर स्पष्ट नहीं है।


3
आप इसके बारे में क्या नहीं समझते हैं या आपको क्या लगता है कि यह क्या करता है? OpenCV प्रलेखन संदर्भ मुझे बहुत स्पष्ट लगता है ...
डैनियल स्लॉफ़

8
@ user588855 हम सभी के लिए यह महत्वपूर्ण है कि आप अपने प्रश्नों की समीक्षा करें और कुछ उत्तरों को स्वीकार करें, जिनमें यह भी शामिल है।
कार्लफिलिप

4
रिकॉर्ड के लिए, cvWaitKey()अब एक पदावनत सी फ़ंक्शन है। waitKey()आधुनिक C ++ समकक्ष है।
StockB

1
क्या आप किसी एक उत्तर को चिह्नित कर सकते हैं (@SuperElectric का अब के लिए सबसे अच्छा लगता है) ताकि प्रश्न का उत्तर दिया जा सके। एक उत्तर की प्रतीक्षा में 4 साल और कई उत्तर पाने के लिए समय की एक लंबी अवधि है ...
rbaleksandar

उदाहरण के लिए @DanielSloof, यह जानना अच्छा होगा कि कौन से मानक रिटर्न मानों का पालन करते हैं।
लहजोन_ज

जवाबों:


138

cvWaitKey(x) / cv::waitKey(x) दो काम करता है:

  1. यह OpenCV विंडो पर एक महत्वपूर्ण प्रेस के लिए x मिलीसेकंड का इंतजार करता है (अर्थात इससे निर्मित cv::imshow())। ध्यान दें कि यह कंसोल इनपुट के लिए स्टड पर नहीं सुनता है। यदि उस दौरान कोई कुंजी दबाया गया था, तो यह कुंजी का ASCII कोड लौटाता है। नहीं तो लौट आता है -1। (यदि x शून्य है, तो यह कुंजी प्रेस के लिए अनिश्चित काल तक प्रतीक्षा करता है।)
  2. यह किसी भी विंडोिंग ईवेंट को हैंडल करता है, जैसे कि विंडो बनाना cv::namedWindow()या उसके साथ इमेज दिखाना cv::imshow()

Opencv नवागंतुकों के लिए एक सामान्य गलती cv::imshow()वीडियो फ्रेम के माध्यम से एक लूप में कॉल करना है, बिना प्रत्येक ड्रा के साथ cv::waitKey(30)। इस मामले में, स्क्रीन पर कुछ भी नहीं दिखता है, क्योंकि हाईगूई को ड्रॉ अनुरोधों को संसाधित करने के लिए कभी भी समय नहीं दिया जाता है cv::imshow()


19

सादा बस, एक्स मिलिसेकंड के cvWaitKey()लिए सोता है , किसी भी कुंजी को दबाने के लिए इंतजार कर रहा है।

int cvWaitKey(int X);

यदि किसी कुंजी को दबाया जाता है, तो यह फ़ंक्शन ASCII कोड की कुंजी देता है। या रिटर्न -1 अगर उस दौरान कोई चाबी नहीं दबाया गया था।


3
यह पूरी कहानी नहीं है। व्यवहार में, भले ही आप कीबोर्ड इनपुट के बारे में परवाह न करें, इस फ़ंक्शन को कॉल करना कुछ OpenCV अनुप्रयोगों के लिए आवश्यक हो सकता है। यहाँ कुछ और जानकारी है
ड्रू नोकें

13

cvWaitKey(0) जब तक आप एक बटन दबाते हैं तब तक आपका कार्यक्रम बंद हो जाता है।

cvWaitKey(10)जब आप एक बटन दबाते हैं तो अपना प्रोग्राम बंद नहीं करते हैं लेकिन अपने प्रोग्राम को समाप्त करने के लिए जागते हैं और सतर्क करते हैं। इसका उपयोग लूप में किया जाता है क्योंकि cvWaitkeyलूप बंद नहीं होता है।

सामान्य उपयोग

char k;

k=cvWaitKey(0);

if(k == 'ESC')

साथ kआप देख सकते हैं कुंजी दबाने था।


5
इसके अलावा थोड़ा और महत्वपूर्ण - यह OpenCV संदेश लूप है। जब तक आप cvWaitKey () को लूप में नहीं बुलाते हैं तब तक आप किसी भी नए डेटा को cvNamedWindow में नहीं देखेंगे
मार्टिन बेकेट

14
-1 मुझ से एक तुलना करने के लिए चार? = Multichar । यह सिर्फ गलत है। या तो प्रिंट करने योग्य चरित्र का उपयोग करें (जो इस मामले में संभव नहीं है क्योंकि ईएससी एक गैर-मुद्रण योग्य चरित्र है, लेकिन क्यू कुंजी का उपयोग करने के उदाहरण के लिए आप एक? = 'क्ष' तुलना कर सकते हैं) या संख्यात्मक अभ्यावेदन में से एक को चुन सकते हैं। ASCII कई संख्यात्मक प्रणालियों का समर्थन करता है: हेक्साडेसिमल (0x1b), दशमलव (27) और ऑक्टल (033)। सभी सूचीबद्ध ईएससी कुंजी का प्रतिनिधित्व करते हैं।
rbaleksandar

1
चार नहीं, तो उपयोग बिट ऑप्स पूर्णांक होना चाहिए
Vlad

@Vlad हाँ, उपयोगकर्ता 2764486 में यह 27 होना चाहिए
FindOutIslamNow

9

। तर्क के 0रूप में व्याख्या की हैinfinite

। HighGUI विंडो को खींचने के लिए, आपको लगातार cv::waitKey()फ़ंक्शन को कॉल करने की आवश्यकता है । स्थिर चित्रों के लिए उदा:

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

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


8

किसी के लिए भी ध्यान दें, जिन्हें cvWaitKey( )फंक्शन की समस्या थी । यदि आप पा रहे हैं कि cvWaitKey(x)सभी इंतजार नहीं कर रहे हैं, तो सुनिश्चित करें कि आपके पास वास्तव में एक खिड़की खुली है (यानी cvNamedWindow(...))। cvNamedWindow(...)किसी भी cvWaitKey()फ़ंक्शन कॉल की घोषणा से पहले रखें ।


SO पर आपका स्वागत है, यह आपके द्वारा की गई जानकारी को पोस्ट करने के लिए एक अच्छी जगह है। आमतौर पर, जब आप कोई उत्तर पोस्ट करते हैं, तो उसे प्रश्न में नया संकेत लाना चाहिए, इसलिए यह निरर्थक पोस्ट नहीं बनाता है। जो आपके पोस्ट के लिए मामला था। यदि आपकी कोई छोटी टिप्पणी है, तो आप बाद में इस प्रश्न पर टिप्पणी कर सकते हैं (जब आपको अधिक प्रतिनिधि मिलें)। यदि आप इसे अभी तक नहीं पढ़ा है, मैं सुझाव है कि आप पूछे जाने वाले प्रश्न के लिए देखने के लिए: stackoverflow.com/faq । सादर
फोर्समैजिक

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

cvWaitKeyबस एक देरी के बारे में कुछ प्रदान करता है। उदाहरण के लिए:

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

Tis मेरे कोड के अलावा था जिसमें एक वीडियो को OpenCV में लोड किया गया था और फ़्रेम आउटपुट किया गया था। 33कोड साधन में नंबर उसके बाद 33ms, एक नया फ्रेम दिखाया जाएगा। इसलिए, 33msस्क्रीन पर दिखाए जा रहे प्रत्येक फ्रेम के बीच एक घना या समय अंतराल था । उम्मीद है की यह मदद करेगा।


1

cvWaitKey(milliseconds) बस कीबोर्ड के अगले कुंजी स्ट्रोक के लिए एक पैरामीटर के रूप में प्रदान किए गए मिलीसेकंड की प्रतीक्षा करें।

मानव आंखें 1/10 सेकंड से कम समय में चलती हुई चीज को नहीं देख पाती हैं, इसलिए हम स्क्रीन पर कुछ समय के लिए उसी छवि फ्रेम को धारण करने के लिए इसका उपयोग करते हैं। जैसे ही कीबोर्ड की कुंजी दबाया जाएगा अगला ऑपरेशन किया जाएगा।

संक्षेप में cvWaitKey(milliseconds)या तो मुख्य प्रेस या millisecondसमय के लिए प्रतीक्षा करें ।


1
"मानव आंखें 1/10 सेकंड से कम समय में चलती हुई चीज को नहीं देख पाती हैं, इसलिए हम इसका उपयोग स्क्रीन पर कुछ समय के लिए एक ही छवि फ़्रेम को रखने के लिए करते हैं। जैसे ही कीबोर्ड की कुंजी दबाया जाता है अगला ऑपरेशन किया जाएगा" यह वास्तव में सवाल का विषय है?
क्वांटम

-1

यह देखने के लिए मिलीसेकेंड प्रतीक्षा करता है कि क्या कुंजी को दबाया गया है, अगर उस अंतराल में दबाया जाता है तो उसका एससीआई मान वापस कर दें, अन्यथा यह -1

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.