विषयसूची:

जेस्चर हॉक: इमेज प्रोसेसिंग आधारित इंटरफेस का उपयोग करते हुए हैंड जेस्चर नियंत्रित रोबोट: 13 चरण (चित्रों के साथ)
जेस्चर हॉक: इमेज प्रोसेसिंग आधारित इंटरफेस का उपयोग करते हुए हैंड जेस्चर नियंत्रित रोबोट: 13 चरण (चित्रों के साथ)

वीडियो: जेस्चर हॉक: इमेज प्रोसेसिंग आधारित इंटरफेस का उपयोग करते हुए हैंड जेस्चर नियंत्रित रोबोट: 13 चरण (चित्रों के साथ)

वीडियो: जेस्चर हॉक: इमेज प्रोसेसिंग आधारित इंटरफेस का उपयोग करते हुए हैंड जेस्चर नियंत्रित रोबोट: 13 चरण (चित्रों के साथ)
वीडियो: Human vs Robot | Artificial Intelligence 2024, जुलाई
Anonim
जेस्चर हॉक: इमेज प्रोसेसिंग आधारित इंटरफेस का उपयोग करते हुए हैंड जेस्चर नियंत्रित रोबोट
जेस्चर हॉक: इमेज प्रोसेसिंग आधारित इंटरफेस का उपयोग करते हुए हैंड जेस्चर नियंत्रित रोबोट

जेस्चर हॉक को TechEvince 4.0 में एक साधारण इमेज प्रोसेसिंग आधारित मानव-मशीन इंटरफ़ेस के रूप में प्रदर्शित किया गया था। इसकी उपयोगिता इस तथ्य में निहित है कि अंतर ड्राइव सिद्धांत पर चलने वाली रोबोट कार को नियंत्रित करने के लिए दस्ताने को छोड़कर किसी अतिरिक्त सेंसर या पहनने योग्य की आवश्यकता नहीं होती है। इस निर्देश में, हम आपको सिस्टम में प्रयुक्त ऑब्जेक्ट ट्रैकिंग और जेस्चर डिटेक्शन के पीछे के कार्य सिद्धांत के बारे में बताएंगे। इस परियोजना का स्रोत कोड जीथब से लिंक के माध्यम से डाउनलोड किया जा सकता है:

चरण 1: आवश्यक चीजें:

आवश्यक चीजें
आवश्यक चीजें
आवश्यक चीजें
आवश्यक चीजें
आवश्यक चीजें
आवश्यक चीजें
आवश्यक चीजें
आवश्यक चीजें
  1. L298N मोटर चालक
  2. डीसी मोटर्स
  3. रोबोट कार चेसिस
  4. Arduino Uno
  5. लीपो बैटरी
  6. Arduino USB केबल (लंबी)
  7. पायथन के साथ ओपनसीवी लाइब्रेरी

चरण 2: कार्य सिद्धांत:

काम के सिद्धांत
काम के सिद्धांत

जेस्चर हॉक एक तीन चरण प्रसंस्करण प्रणाली है जैसा कि आप ऊपर दिए गए चित्र में देख सकते हैं।

चरण 3: इनपुट कैप्चर और प्रोसेसिंग:

इनपुट कैप्चर और प्रोसेसिंग
इनपुट कैप्चर और प्रोसेसिंग

उपरोक्त आरेख में दी गई व्यापक श्रेणियों में इनपुट कैप्चर को समझा जा सकता है।

पर्यावरण से हाथ के आकार को निकालने के लिए, हमें एक निश्चित रंग (इस मामले में - बैंगनी नीला ') के मास्किंग या फ़िल्टरिंग का उपयोग करने की आवश्यकता है। ऐसा करने के लिए आपको छवि को बीजीआर से एचएसवी प्रारूप में परिवर्तित करने की आवश्यकता है जो निम्नलिखित कोड स्निपेट का उपयोग करके किया जा सकता है।

एचएसवी = cv2.cvtColor (फ्रेम, cv2. COLOR_BGR2HSV)

अब, अगला कदम मास्क या फिल्टर के माध्यम से हाथ निकालने के लिए एचएसवी मापदंडों की वांछित सीमा का पता लगाना है। इसके लिए उपयुक्त रेंज खोजने के लिए ट्रैक बार का उपयोग करना सबसे अच्छा तरीका है। इस परियोजना के लिए उपयोग किए गए ट्रैक बार का स्क्रीनशॉट यहां दिया गया है।

चरण 4:

छवि
छवि

चरण 5:

यहाँ, मास्क निर्माण के लिए ऐसा ट्रैकबार बनाने के लिए नीचे एक कोड स्निपेट दिया गया है:

आयात cv2

npdef कुछ नहीं (x) के रूप में numpy आयात करें: cv2.namedWindow('image') img = cv2. VideoCapture(0) cv2.createTrackbar('l_H', 'image', 110, 255, कुछ भी नहीं) cv2.createTrackbar('l_S) पास करें ', 'इमेज', 50, 255, कुछ नहीं) cv2.createTrackbar('l_V', 'image', 50, 255, कुछ नहीं) cv2.createTrackbar('h_H', 'image', 130, 255, कुछ नहीं) cv2. createTrackbar('h_S', 'image', 255, 255, कुछ नहीं) cv2.createTrackbar('h_V', 'image', 255, 255, कुछ नहीं) जबकि(1): _, फ्रेम = img.read()

hsv = cv2.cvtColor (फ़्रेम, cv2. COLOR_BGR2HSV) lH = cv2.getTrackbarPos('l_H', 'image') lS = cv2.getTrackbarPos('l_S', 'image') lV = cv2.getTrackbarPos',('l_V' 'इमेज') hH = cv2.getTrackbarPos('h_H', 'image') hS = cv2.getTrackbarPos('h_S', 'image') hV = cv2.getTrackbarPos('h_V', 'image') lower_R = np. array([lH, lS, lV]) high_R = np.array([hH, hS, hV]) मास्क = cv2.inRange(hsv, lower_R, high_R) res = cv2.bitwise_and(फ्रेम, फ्रेम, मास्क = मास्क) cv2.imshow('image', res) k = cv2.waitKey(1) & 0xFF अगर k == 27: ब्रेक cv2.destroyAllWindows()

चरण 6: प्रसंस्करण भाग:

प्रसंस्करण भाग
प्रसंस्करण भाग

ठीक है, हमें हाथ की ज्यामितीय आकृति मिल गई है, अब इसका दोहन करने और हाथ के हावभाव को समझने के लिए इसका उपयोग करने का समय आ गया है।

उन्नतोत्तर पेटा:

उत्तल पतवार के माध्यम से, हम आकृति में मौजूद चरम बिंदुओं के माध्यम से एक अनुमानित बहुभुज को फिट करने का प्रयास करते हैं। बाईं ओर मौजूद छवि उस अनुमानित बहुभुज को दिखाती है जिसे लाल रंग से चिह्नित उत्तल बिंदुओं के साथ आकृति को सौंपा गया था।

उत्तल बिंदु आकार में वे बिंदु हैं जो इस अनुमानित बहुभुज के एक तरफ से सबसे दूर हैं। लेकिन, उत्तल पतवार के साथ समस्या यह है कि इसकी गणना के दौरान, हमें सभी उत्तल बिंदुओं की एक सरणी मिलेगी, लेकिन हमें जो चाहिए वह नीले बिंदु उत्तल बिंदु है। हम आपको बताएंगे कि इसकी आवश्यकता क्यों है।

इस उत्तल बिंदु को खोजने के लिए, हमें निकटतम भुजा वाले उत्तल बिंदु की दूरी ज्ञात करने के लिए लंबवत दूरी सूत्र लागू करना होगा। हमने देखा कि नीले बिंदु की ओर से अधिकतम दूरी है और इसलिए हमें यह बिंदु मिलता है।

चरण 7:

छवि
छवि

चरण 8:

छवि
छवि

आगे हमें अंगूठे की नोक (या चरम बिंदु) को क्षैतिज के साथ इस उत्तल बिंदु से जोड़ने वाली रेखा के झुकाव को खोजने की जरूरत है।

चरण 9:

छवि
छवि

उपरोक्त मामले में, कोण α 0 से 90 डिग्री के बीच होना चाहिए यदि इशारा बाएं मोड़ के लिए है। वह है tan(α) सकारात्मक होना चाहिए।

चरण 10:

छवि
छवि

उपरोक्त मामले में, कोण α 180 से 90 डिग्री के बीच होना चाहिए यदि इशारा दाएं मोड़ के लिए है। यानी tan(α) ऋणात्मक होना चाहिए।

इसलिए, यदि टैन α धनात्मक है, तो बाएँ मुड़ें। यदि टैन α ऋणात्मक है, तो दाएँ मुड़ें। अब, यह देखने का समय है कि सबसे महत्वपूर्ण स्टॉप कमांड का पता कैसे लगाया जाए।

यहां, एक निर्दिष्ट अनुपात (हिट और परीक्षण द्वारा पाया गया) की जांच की जाती है और अधिकतम मामलों में दूरी का यह अनुपात इस विशेष सीमा में रहता है।

चरण 11:

छवि
छवि

अंत में, ओपनसीवी में मैचशैप () फ़ंक्शन द्वारा फॉरवर्ड मोशन जेस्चर का विश्लेषण किया जाता है। यह फ़ंक्शन दो काउंटरों के आकार की तुलना करता है, इस मामले में, उपरोक्त चित्र में दाईं ओर प्रशिक्षण उदाहरण के बीच उपरोक्त छवि के बाईं ओर समोच्च के बीच। यह दो आकृति के आकार में मौजूद भिन्नता के अनुसार 0 से 2 या 3 के बीच का मान देता है। समान रूप से समान समोच्च के लिए, यह 0 देता है।

रिट = cv2.matchShapes(cnt1, cnt2, 1, 0.0)

यहाँ, cn1 और cnt2 दो आकृतियाँ हैं जिनकी तुलना की जानी है।

चरण 12: गति नियंत्रण:

गति नियंत्रण
गति नियंत्रण

पायसीरियल:

हमने Arduino USB केबल के माध्यम से Arduino Uno को संप्रेषित करने के लिए संसाधित डेटा को सीरियल डेटा में बदलने के लिए Python की PySerial लाइब्रेरी का उपयोग किया। एक बार ओपनसीवी द्वारा एक विशेष इशारा का पता चलने के बाद हमने एक अस्थायी चर 'x' बनाया और इसे कुछ अद्वितीय मान दिया और इसे निम्न कमांड लाइन का उपयोग करके सीरियल इनपुट में परिवर्तित कर दिया: -

सीरियल आयात करें #Pyserial पुस्तकालय आयात करने के लिए

serial. Serial('', baudrate = '9600', timeout = '0') # सीरियल आउटपुट सेट करना.. PORT NAME पोर्ट का नाम है जिसके द्वारा डेटा ट्रांसमिशन होगा।

serial.write(b'x') # x पोर्ट को भेजा जाने वाला अक्षर है…b इस स्ट्रिंग को बाइट्स में बदलना है।

Arduino प्रसंस्करण:

अब arduino को इस तरह से कोडित किया गया है कि प्रत्येक अलग सीरियल x को रोबोट की एक सुचारू गति के लिए जिम्मेदार कुछ क्रियाओं के लिए रैखिक रूप से मैप किया जाता है (कहते हैं कि बाएं इशारे का पता लगाने से बाएं मुड़ने के लिए मोटरों को ट्रिगर किया जाएगा)। हम कोड को ठीक से बदलकर प्रत्येक पहिये की गति को अनुवाद के साथ-साथ घूर्णी रूप से नियंत्रित कर सकते हैं।

L298N मोटर चालक:-

मोटर चालक का उपयोग मोटर और शक्ति स्रोत के बीच मध्यस्थ के रूप में किया जाता है क्योंकि कम वोल्टेज रेटिंग के कारण मोटर्स को सीधे संचालित नहीं किया जा सकता है। Li-Po बैटरी इसके 12V इनपुट टर्मिनल से जुड़ी है और हम arduino के 5V सॉकेट को मोटर ड्राइवर के 5V इनपुट सॉकेट से जोड़ते हैं, जो अंततः Li-Po के ग्राउंड को और साथ ही arduino को मोटर ड्राइवर के कॉमन ग्राउंड सॉकेट में जोड़ता है।

अब मोटर्स के टर्मिनल दिए गए सॉकेट से जुड़े हुए हैं। अंत में हम मोटर के लिए इनपुट टर्मिनलों को arduino के PWM आउटपुट सॉकेट से जोड़ते हैं, जिससे हमें गति के घूर्णी और अनुवाद पहलुओं को सटीक रूप से तय करने की अनुमति मिलती है।

सिफारिश की: