Სარჩევი:

Gesture Hawk: ხელით ჟესტით კონტროლირებადი რობოტი გამოსახულების დამუშავებაზე დაფუძნებული ინტერფეისის გამოყენებით: 13 ნაბიჯი (სურათებით)
Gesture Hawk: ხელით ჟესტით კონტროლირებადი რობოტი გამოსახულების დამუშავებაზე დაფუძნებული ინტერფეისის გამოყენებით: 13 ნაბიჯი (სურათებით)

ვიდეო: Gesture Hawk: ხელით ჟესტით კონტროლირებადი რობოტი გამოსახულების დამუშავებაზე დაფუძნებული ინტერფეისის გამოყენებით: 13 ნაბიჯი (სურათებით)

ვიდეო: Gesture Hawk: ხელით ჟესტით კონტროლირებადი რობოტი გამოსახულების დამუშავებაზე დაფუძნებული ინტერფეისის გამოყენებით: 13 ნაბიჯი (სურათებით)
ვიდეო: იოგა მთელი სხეულისთვის ცხიმების წვის კომპლექსი. ჩვენ ვაჩქარებთ მეტაბოლიზმს 2024, ივლისი
Anonim
Gesture Hawk: ხელით ჟესტით კონტროლირებადი რობოტი გამოსახულების დამუშავებაზე დაფუძნებული ინტერფეისის გამოყენებით
Gesture Hawk: ხელით ჟესტით კონტროლირებადი რობოტი გამოსახულების დამუშავებაზე დაფუძნებული ინტერფეისის გამოყენებით

Gesture Hawk გამოჩნდა TechEvince 4.0-ში, როგორც მარტივი გამოსახულების დამუშავება, რომელიც დაფუძნებულია ადამიანსა და მანქანას. მისი სარგებლობა მდგომარეობს იმაში, რომ რობოტული მანქანის გასაკონტროლებლად, რომელიც მუშაობს დიფერენციალური მართვის პრინციპით, არ არის საჭირო დამატებითი სენსორები და ხელთათმანების გარდა. ამ სასწავლო ინსტრუქციაში ჩვენ გაგიმხელთ სისტემაში გამოყენებული ობიექტების თვალყურის დევნისა და ჟესტების გამოვლენის მუშაობის პრინციპს. ამ პროექტის კოდის გადმოწერა შესაძლებელია Github– დან ბმულის საშუალებით:

ნაბიჯი 1: საჭირო ნივთები:

საჭირო ნივთები
საჭირო ნივთები
საჭირო ნივთები
საჭირო ნივთები
საჭირო ნივთები
საჭირო ნივთები
საჭირო ნივთები
საჭირო ნივთები
  1. L298N ძრავის მძღოლი
  2. DC მოტორსი
  3. რობოტი მანქანის შასი
  4. არდუინო უნო
  5. LiPo ბატარეები
  6. Arduino USB კაბელი (გრძელი)
  7. OpenCV ბიბლიოთეკა პითონთან ერთად

ნაბიჯი 2: მუშაობის პრინციპი:

სამუშაო პრინციპი
სამუშაო პრინციპი

Gesture Hawk არის სამფაზიანი დამუშავების სისტემა, როგორც ხედავთ ზემოთ დიაგრამაში.

ნაბიჯი 3: შეყვანის აღება და დამუშავება:

შეყვანის აღება და დამუშავება
შეყვანის აღება და დამუშავება

შეყვანის აღქმა შეიძლება გავიგოთ ზემოთ მოცემულ დიაგრამაში მოცემულ უფრო ფართო კატეგორიებში.

გარემოსგან ხელის ფორმის ამოღების მიზნით, ჩვენ უნდა გამოვიყენოთ გარკვეული ფერის ნიღაბი ან ფილტრაცია (ამ შემთხვევაში - იისფერი ლურჯი). ამისათვის თქვენ უნდა გადააკეთოთ სურათი BGR– დან HSV ფორმატში, რაც შეიძლება გაკეთდეს შემდეგი კოდის ამობეჭდვის გამოყენებით.

hsv = cv2.cvtColor (ჩარჩო, cv2. COLOR_BGR2HSV)

ახლა, შემდეგი ნაბიჯი არის HSV პარამეტრების სასურველი დიაპაზონის პოვნა, რათა ხელით ამოიღოთ ნიღაბი ან ფილტრი. ამისათვის საუკეთესო გზაა გამოიყენოთ ბარი შესაბამისი დიაპაზონის საპოვნელად. აქ მოცემულია ამ პროექტისთვის გამოყენებული ტრეკის ზოლის ეკრანის ანაბეჭდი.

ნაბიჯი 4:

გამოსახულება
გამოსახულება

ნაბიჯი 5:

აქ არის კოდის ფრაგმენტი, რომელიც მოცემულია ნიღბის მშენებლობისთვის.

იმპორტი cv2

შემოტანა numpy როგორც npdef არაფერი (x): გაივლის cv2.namedWindow ('image') img = cv2. VideoCapture (0) cv2.createTrackbar ('l_H', 'image', 110, 255, არაფერი) cv2.createTrackbar ('l_S ',' image ', 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): _, frame = 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', 'image') hH = cv2.getTrackbarPos ('h_H', 'image') hS = cv2.getTrackbarPos ('h_S', 'image') hV = cv2.getTrackbarPos ('h_V', 'image') ქვედა_R = np მასივი ([lH, lS, lV]) უმაღლესი_R = np. მასივი ([hH, hS, hV]) ნიღაბი = cv2.inRange (hsv, ქვედა_R, უმაღლესი_R) res = cv2.bitwise_and (frame, frame, mask = mask) cv2.imshow ("სურათი", რეს) k = cv2.waitKey (1) & 0xFF თუ k == 27: შესვენება cv2.destroyAllWindows ()

ნაბიჯი 6: დამუშავების ნაწილი:

დამუშავების ნაწილი
დამუშავების ნაწილი

ჩვენ გვაქვს ხელის გეომეტრიული ფორმა, ახლა დროა გამოვიყენოთ იგი და გამოვიყენოთ იგი ხელის ჟესტის გასარკვევად.

ამოზნექილი კორპუსი:

ამოზნექილი კორპუსის საშუალებით, ჩვენ ვცდილობთ მოვათავსოთ სავარაუდო პოლიგონი ფორმაში არსებული უკიდურესი წერტილების საშუალებით. მარცხნივ გამოსახული სურათი გვიჩვენებს სავარაუდო პოლიგონს, რომელიც მიენიჭა ფორმას წითელი ფერით მონიშნული ამოზნექილი წერტილებით.

ამოზნექილი წერტილები არის ფორმის ის წერტილები, რომლებიც ყველაზე შორს არის ამ სავარაუდო მრავალკუთხედის გვერდიდან. მაგრამ, ამოზნექილი კორპუსის პრობლემა იმაში მდგომარეობს, რომ მისი გამოთვლის დროს ჩვენ მივიღებთ ყველა ამოზნექილი წერტილის მასივს, მაგრამ რაც ჩვენ გვჭირდება არის ლურჯი წვეტიანი ამოზნექილი წერტილი. ჩვენ გეტყვით, რატომ არის საჭირო.

ამ ამოზნექილი წერტილის საპოვნელად, ჩვენ უნდა გამოვიყენოთ პერპენდიკულარული მანძილის ფორმულა უახლოეს მხარეს ამოზნექილი წერტილის მანძილის საპოვნელად. ჩვენ შევნიშნეთ, რომ ლურჯი წვეტიანი წერტილი ფლობს მაქსიმალურ მანძილს გვერდიდან და ჩვენ ვიღებთ ამ წერტილს.

ნაბიჯი 7:

გამოსახულება
გამოსახულება

ნაბიჯი 8:

გამოსახულება
გამოსახულება

შემდეგ ჩვენ უნდა ვიპოვოთ ხაზის მიდრეკილება, რომელიც უერთდება ცერა თითის წვერს (ან უკიდურეს წერტილს) ამ ამობურცულ წერტილთან ჰორიზონტალურად.

ნაბიჯი 9:

გამოსახულება
გამოსახულება

ზემოაღნიშნულ შემთხვევაში, კუთხე α უნდა იყოს 0 -დან 90 გრადუსამდე, თუ ჟესტი არის მარცხენა მოსახვევისთვის. ეს არის tan (α) უნდა იყოს დადებითი.

ნაბიჯი 10:

გამოსახულება
გამოსახულება

ზემოაღნიშნულ შემთხვევაში, კუთხე α უნდა იყოს 180 -დან 90 გრადუსამდე, თუ ჟესტი არის სწორი მოსახვევისთვის. ანუ tan (α) უნდა იყოს უარყოფითი.

ამიტომ, თუ Tan α დადებითია, მაშინ მარცხნივ მოუხვიეთ. თუ Tan α არის უარყოფითი, მაშინ მარჯვნივ. ახლა დროა ვნახოთ როგორ გამოვავლინოთ ყველაზე მნიშვნელოვანი გაჩერების ბრძანება.

აქ შემოწმებულია განსაზღვრული თანაფარდობა (ნაპოვნია დარტყმით და ცდით) და მაქსიმალურ შემთხვევებში მანძილების ეს თანაფარდობა რჩება ამ კონკრეტულ დიაპაზონში.

ნაბიჯი 11:

გამოსახულება
გამოსახულება

დაბოლოს, წინ მოძრაობის ჟესტი გაანალიზებულია matchChape () ფუნქციით OpenCV– ში. ეს ფუნქცია ადარებს ორი მრიცხველის ფორმას, ამ შემთხვევაში, ზემოთ მოყვანილ სურათზე ტრენინგის მაგალითს შორის ზემოთ მოცემული სურათის მარცხენა კონტურს შორის. ის აბრუნებს მნიშვნელობას 0 -დან 2 -მდე ან 3 -მდე, ორი კონტურის ფორმაში არსებული ვარიაციის მიხედვით. იდენტურად იგივე კონტურისთვის, ის ბრუნდება 0.

ret = cv2.matchShapes (cnt1, cnt2, 1, 0.0)

აქ, cn1 და cnt2 არის ორი კონტური, რომლებიც უნდა შევადაროთ.

ნაბიჯი 12: მოძრაობის კონტროლი:

მოძრაობის კონტროლი
მოძრაობის კონტროლი

PySerial:

ჩვენ გამოვიყენეთ პითონის PySerial ბიბლიოთეკა დამუშავებული მონაცემების სერიულ მონაცემებად გადასაყვანად, Arduino Uno– ს Arduino USB კაბელის საშუალებით გადაცემისთვის. მას შემდეგ რაც კონკრეტული ჟესტი გამოვლინდა opencv– ს მიერ, ჩვენ შევქმენით დროებითი ცვლადი, ვთქვათ ‘x’ და მივანიჭეთ მას უნიკალური მნიშვნელობა და გადავაკეთეთ იგი სერიულ შეყვანად შემდეგი ბრძანების ხაზის გამოყენებით:-

სერიული იმპორტი #Pyserial ბიბლიოთეკის იმპორტისთვის

serial. Serial ('', baudrate = '9600', timeout = '0') # სერიული გამომუშავების დაყენება..პორტის სახელი არის პორტის სახელი, რომლითაც მონაცემთა გადაცემა მოხდება.

serial.write (b'x ') # x არის ანბანი, რომელიც იგზავნება პორტში … b არის ამ სტრიქონის ბაიტებად გადაყვანა.

არდუინოს დამუშავება:

არდუინო არის კოდირებული ისე, რომ თითოეული განსხვავებული სერიული x წრფივად არის ასახული გარკვეულ მოქმედებაზე, რომელიც პასუხისმგებელია რობოტის შეუფერხებელ მოძრაობაზე (ვთქვათ, მარცხენა ჟესტის გამოვლენა გამოიწვევს ძრავების მარჯვნივ გადახვევას). ჩვენ შეგვიძლია გავაკონტროლოთ თითოეული ბორბლის მოძრაობა როგორც თარგმანულად, ასევე ბრუნვით, კოდის სწორად შეცვლით.

L298N ძრავის მძღოლი:-

საავტომობილო დრაივერი გამოიყენება როგორც შუამავალი ძრავასა და ენერგიის წყაროს შორის, რადგან ძრავები არ შეიძლება პირდაპირ იკვებებოდეს დაბალი ძაბვის მაჩვენებლების გამო. Li-Po ბატარეა დაკავშირებულია მის 12 ვ შეყვანის ტერმინალთან და ჩვენ არდუინოს 5 ვ სოკეტს ვუკავშირდებით ძრავის მძღოლის 5 ვ შეყვანის სოკეტს, რომელიც საბოლოოდ აკავშირებს Li-Po– ს მიწას, ასევე არდუინოს ძრავის დრაივერის საერთო ადგილზე.

ახლა ძრავების ტერმინალები დაკავშირებულია მოცემულ სოკეტებთან. დაბოლოს, ჩვენ ვაკავშირებთ ძრავის შეყვანის ტერმინალებს arduino– ს PWM გამომავალ ბუდეებთან, რაც გვაძლევს თავისუფალს, რომ ზუსტად განვსაზღვროთ მოძრაობის ბრუნვისა და თარგმანის ასპექტები.

გირჩევთ: