สารบัญ:
- ขั้นตอนที่ 1: สิ่งที่จำเป็น:
- ขั้นตอนที่ 2: หลักการทำงาน:
- ขั้นตอนที่ 3: จับอินพุตและประมวลผล:
- ขั้นตอนที่ 4:
- ขั้นตอนที่ 5:
- ขั้นตอนที่ 6: ส่วนการประมวลผล:
- ขั้นตอนที่ 7:
- ขั้นตอนที่ 8:
- ขั้นตอนที่ 9:
- ขั้นตอนที่ 10:
- ขั้นตอนที่ 11:
- ขั้นตอนที่ 12: การควบคุมการเคลื่อนไหว:
- ขั้นตอนที่ 13:
วีดีโอ: Gesture Hawk: หุ่นยนต์ควบคุมด้วยท่าทางมือโดยใช้อินเทอร์เฟซที่ใช้การประมวลผลภาพ: 13 ขั้นตอน (พร้อมรูปภาพ)
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:05
Gesture Hawk จัดแสดงใน TechEvince 4.0 ในรูปแบบอินเทอร์เฟซระหว่างมนุษย์และเครื่องจักรในการประมวลผลภาพอย่างง่าย ประโยชน์ของมันคือความจริงที่ว่าไม่มีเซ็นเซอร์เพิ่มเติมหรือสวมใส่ได้ยกเว้นถุงมือเป็นสิ่งจำเป็นในการควบคุมรถหุ่นยนต์ที่ทำงานบนหลักการไดรฟ์ที่แตกต่างกัน ในคำแนะนำนี้ เราจะนำคุณผ่านหลักการทำงานเบื้องหลังการติดตามวัตถุและการตรวจจับท่าทางที่ใช้ในระบบ ซอร์สโค้ดของโครงการนี้สามารถดาวน์โหลดได้จาก Github ผ่านลิงค์:
ขั้นตอนที่ 1: สิ่งที่จำเป็น:
- ตัวขับมอเตอร์ L298N
- มอเตอร์กระแสตรง
- โครงรถหุ่นยนต์
- Arduino Uno
- แบตเตอรี่ LiPo
- สาย USB Arduino (ยาว)
- ไลบรารี OpenCV พร้อม Python
ขั้นตอนที่ 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, nothing) cv2.createTrackbar('h_V', 'image', 255, 255, nothing) while(1): _, frame = img.read()
hsv = cv2.cvtColor(frame, cv2. COLOR_BGR2HSV)lH = cv2.getTrackbarPos('l_H', 'image') lS = cv2.getTrackbarPos('l_S', 'image') lV = cv2.getTrackbar'Pos, ('l_V' 'image') 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]) above_R = np.array([hH, hS, hV]) mask = cv2.inRange(hsv, lower_R, above_R) res = cv2.bitwise_and(frame, frame, mask= mask) cv2.imshow('image', res) k = cv2.waitKey(1) & 0xFF if k == 27: break cv2.destroyAllWindows()
ขั้นตอนที่ 6: ส่วนการประมวลผล:
เรามีรูปทรงเรขาคณิตของมือแล้ว ตอนนี้ถึงเวลาที่จะใช้มันและใช้มันเพื่อหาท่าทางของมือ
นูนฮัลล์:
เราพยายามใส่รูปหลายเหลี่ยมโดยประมาณผ่านจุดสุดขั้วที่มีอยู่ในรูปร่างผ่านตัวเรือนูน รูปภาพทางด้านซ้ายแสดงรูปหลายเหลี่ยมโดยประมาณที่กำหนดให้กับรูปร่างโดยมีจุดนูนที่ทำเครื่องหมายด้วยสีแดง
จุดนูนคือจุดที่อยู่ในรูปร่างซึ่งอยู่ห่างจากด้านข้างของรูปหลายเหลี่ยมโดยประมาณนี้มากที่สุด แต่ปัญหาของตัวเรือนูนคือในระหว่างการคำนวณ เราจะได้รับอาร์เรย์ของจุดนูนทั้งหมด แต่สิ่งที่เราต้องการคือจุดนูนแหลมสีน้ำเงิน เราจะบอกคุณว่าทำไมจึงจำเป็น
ในการหาจุดนูนนี้ เราต้องใช้สูตรระยะทางตั้งฉากเพื่อหาระยะห่างของจุดนูนที่มีด้านที่ใกล้ที่สุด เราสังเกตว่าจุดแหลมสีน้ำเงินมีระยะห่างสูงสุดจากด้านข้าง ดังนั้นเราจึงได้จุดนี้
ขั้นตอนที่ 7:
ขั้นตอนที่ 8:
ต่อไปเราต้องหาความเอียงของเส้นที่เชื่อมปลายหัวแม่มือ (หรือจุดสุดขั้ว) กับจุดนูนนี้ด้วยแนวนอน
ขั้นตอนที่ 9:
ในกรณีข้างต้น มุม α ควรอยู่ระหว่าง 0 ถึง 90 องศา หากท่าทางสัมผัสเป็นการเลี้ยวซ้าย นั่นคือ tan(α) ควรเป็นค่าบวก
ขั้นตอนที่ 10:
ในกรณีข้างต้น มุม α ควรอยู่ระหว่าง 180 ถึง 90 องศา หากท่าทางสัมผัสเป็นการเลี้ยวขวา นั่นคือ tan(α) ควรเป็นลบ
ดังนั้น ถ้า Tan α เป็นบวก ให้เลี้ยวซ้าย ถ้า Tan α เป็นลบ ให้เลี้ยวขวา ถึงเวลาดูวิธีตรวจหาคำสั่งหยุดที่สำคัญที่สุด
ในที่นี้ อัตราส่วนที่ระบุ (พบจากการชนและการทดลอง) จะถูกตรวจสอบ และในกรณีสูงสุด อัตราส่วนของระยะทางนี้ยังคงอยู่ในช่วงเฉพาะนี้
ขั้นตอนที่ 11:
ในที่สุด ท่าทางการเคลื่อนไหวไปข้างหน้าจะถูกวิเคราะห์โดยฟังก์ชัน matchShape() ใน OpenCV ฟังก์ชันนี้เปรียบเทียบรูปร่างของตัวนับสองตัว ในกรณีนี้ ระหว่างตัวอย่างการฝึกบน thright ในภาพด้านบนกับเส้นขอบทางด้านซ้ายของภาพด้านบน ส่งกลับค่าตั้งแต่ 0 ถึง 2 หรือ 3 ตามรูปแบบที่มีอยู่ในรูปร่างของสองรูปทรง สำหรับรูปร่างที่เหมือนกัน จะส่งกลับ 0
ret = cv2.matchShapes (cnt1, cnt2, 1, 0.0)
ในที่นี้ cn1 และ cnt2 เป็นรูปทรงสองเส้นที่จะนำมาเปรียบเทียบกัน
ขั้นตอนที่ 12: การควบคุมการเคลื่อนไหว:
PySerial:
เราใช้ไลบรารี PySerial ของ python เพื่อแปลงข้อมูลที่ประมวลผลเป็นข้อมูลอนุกรมเพื่อสื่อสารกับ Arduino Uno ผ่าน Arduino USB Cable เมื่อตรวจพบท่าทางสัมผัสเฉพาะโดย opencv เราได้สร้างตัวแปรชั่วคราวที่บอกว่า 'x' และกำหนดค่าที่ไม่ซ้ำกันให้กับมันและแปลงเป็นอินพุตแบบอนุกรมโดยใช้บรรทัดคำสั่งต่อไปนี้: -
นำเข้าซีเรียล #เพื่อนำเข้าไลบรารี Pyserial
serial. Serial('', baudrate = '9600', timeout = '0') # setting up serial output.. PORT NAME คือชื่อพอร์ตที่การรับส่งข้อมูลจะเกิดขึ้น
serial.write(b'x') # x คือตัวอักษรที่ส่งไปยังพอร์ต …b คือการแปลงสตริงนี้เป็นไบต์
การประมวลผล Arduino:
ตอนนี้ Arduino ได้รับการเข้ารหัสในลักษณะที่แต่ละอนุกรม x ต่างกันถูกแมปเชิงเส้นกับการกระทำบางอย่างที่รับผิดชอบสำหรับการเคลื่อนไหวที่ราบรื่นของหุ่นยนต์ (เช่นการตรวจจับท่าทางซ้ายจะทำให้มอเตอร์ทางด้านขวาเพื่อเลี้ยวซ้าย) เราสามารถควบคุมการเคลื่อนที่ของล้อแต่ละล้อได้ทั้งแบบแปลและหมุนโดยเปลี่ยนรหัสอย่างเหมาะสม
L298N ตัวขับมอเตอร์:-
Motor Driver ถูกใช้เป็นตัวกลางระหว่างมอเตอร์และแหล่งพลังงาน เนื่องจากมอเตอร์ไม่สามารถขับเคลื่อนโดยตรงได้เนื่องจากพิกัดแรงดันไฟฟ้าต่ำ แบตเตอรี่ Li-Po เชื่อมต่อกับขั้วอินพุต 12V และเราเชื่อมต่อซ็อกเก็ต 5V ของ Arduino กับซ็อกเก็ตอินพุต 5V ของไดรเวอร์มอเตอร์ ในที่สุดเชื่อมต่อกับกราวด์ของ Li-Po และ Arduino ในซ็อกเก็ตกราวด์ทั่วไปของไดรเวอร์มอเตอร์
ตอนนี้ขั้วต่อของมอเตอร์เชื่อมต่ออยู่ที่ซ็อกเก็ตที่ให้ไว้ ในที่สุดเราก็เชื่อมต่อขั้วอินพุตสำหรับมอเตอร์กับซ็อกเก็ตเอาต์พุต PWM ของ Arduino ทำให้เราตัดสินใจเกี่ยวกับการหมุนและการแปลของการเคลื่อนไหวได้อย่างแม่นยำ
แนะนำ:
การวัดระยะใกล้เคียงด้วย Gesture Sensor APDS9960: 6 ขั้นตอน
การวัดความใกล้เคียงระยะทางด้วยเซ็นเซอร์ท่าทางสัมผัส APDS9960: ในบทช่วยสอนนี้ เราจะเรียนรู้วิธีวัดระยะทางโดยใช้เซ็นเซอร์ท่าทางสัมผัส APDS9960, Arduino และ Visuino ดูวิดีโอ
Simple Gesture Control - ควบคุมของเล่น RC ของคุณด้วยการเคลื่อนไหวของแขน: 4 ขั้นตอน (พร้อมรูปภาพ)
Simple Gesture Control - ควบคุมของเล่น RC ของคุณด้วยการเคลื่อนไหวของแขน: ยินดีต้อนรับสู่ 'ible' #45 ของฉัน เมื่อไม่นานมานี้ ฉันสร้าง BB8 รุ่น RC ที่ทำงานได้อย่างสมบูรณ์โดยใช้ชิ้นส่วน Lego Star Wars… https://www.instructables.com/id/Whats-Inside-My-R…เมื่อฉันเห็นว่ามันเจ๋งแค่ไหน Force Band ที่สร้างโดย Sphero ฉันคิดว่า: "ตกลง ฉันค
วิธีใช้ APDS9960 Gesture Sensor กับ Arduino: 7 ขั้นตอน
วิธีใช้เซ็นเซอร์ท่าทางสัมผัส APDS9960 กับ Arduino: ในบทช่วยสอนนี้ เราจะเรียนรู้วิธีใช้เซ็นเซอร์ท่าทางสัมผัส APDS9960 กับ Arduino เพื่อแสดงทิศทางของมือบนจอแสดงผล OLED โดยใช้ซอฟต์แวร์ Visuino ดูวิดีโอ
Gesture Control Skeleton Bot - 4WD Hercules Mobile Robotic Platform - Arduino IDE: 4 ขั้นตอน (พร้อมรูปภาพ)
Gesture Control Skeleton Bot - 4WD Hercules Mobile Robotic Platform - Arduino IDE: ยานพาหนะควบคุมท่าทางที่ทำโดย Seeedstudio Skeleton Bot - 4WD Hercules Mobile Robotic Platform มีความสนุกสนานมากมายในช่วงการจัดการการแพร่ระบาดของโรคหลอดเลือดหัวใจที่บ้าน เพื่อนของฉันให้ 4WD Hercules Mobile Robotic Platform แก่ฉันเหมือนคุณ
Minecraft Gesture Controller: 10 ขั้นตอน (พร้อมรูปภาพ)
Minecraft Gesture Controller: ขยับร่างกายของคุณเพื่อเล่น Minecraft! อะไร!! ใช่. ตรวจสอบวิดีโอสำหรับการสาธิต :) บทช่วยสอนนี้จะแสดงวิธีสร้างตัวควบคุมเกมด้วยท่าทางของคุณเองสำหรับ Minecraft (หรือเกมคอมพิวเตอร์ที่คุณโปรดปราน) จูงมือเดิน/วิ่ง/กระโดด มองไปรอบๆ