ผู้เขียนบทความ:นายชยธร เรืองณรงค์ COE#008
คณะวิศวกรรมศาสตร์:สาขาวิศวกรรมคอมพิวเตอร์
วิชา:04-513-201 การโปรแกรมคอมพิวเตอร์ขั้นสูง 1/2566
ความเป็นมา
จัดทำเพื่อควบคุมอุปกรด้วยมือผ่านระบบ AI Virtual Mouse โดยไม่ต้องใช้เมาส์ในการควบคุมการทำงานของคอมพิวเตอร์แต่จะควบคุมผ่านการขยับมือแทนที่ และช่วยเพิ่มความสะดวกในการควบคุมการทำของคอมพิวเตอร์หรืออุปกรอื่น
AI Virtual Mouse มีความหลากหลาย สามารถนำไปใช้ในการควบคุมเครื่องคอมพิวเตอร์และแอปพลิเคชันต่างๆ ได้ เช่น การทำงานในแวดวงการสร้างเนื้อหามัลติมีเดีย, ระบบการควบคุมด้วยท่าทางในงานอุตสาหกรรม, และในแอพพลิเคชัน VR (Virtual Reality) ที่ทำให้ผู้ใช้สามารถควบคุมสิ่งต่างๆ ในโลกเสมือนได้โดยไม่ต้องใช้เมาส์หรือคีย์บอร์ดเดิม โดยทำให้การใช้งานเป็นไปอย่างสะดวกและสมจริงมากขึ้น
วัตถุประสงค์
1.เพื่อความสะดวกสบาย
2.เพื่อศึกภาษา python
3.เพื่อเพิมความทันสมัย
4.เพื่อพัฒนาระบบการควบคุม
5.เพื่อควบคุมคอมพิวเตอร์ด้วยมือแทนที่เมาส์
ขอบเขต
1.สามารถให้ผู้ใช้ควบคุมการเคลื่อนที่ของเมาส์และการคลิกผ่านท่าทางหรือการเคลื่อนไหวของมือ
2.สามารถใช้ควบคุมแทนเมาได้
ประโยชน์ที่คาดว่าจะได้รับ
1.ความสะดวกสบายสำหรับผู้ใช้ที่ไม่สามารถใช้เมาส์หรือคีย์บอร์ดได้: ในกรณีที่มีความจำเป็นต้องใช้วิธีการควบคุมที่แตกต่าง ผู้ใช้สามารถใช้ AI Virtual Mouse ในการทำงาน
2.การทำงานในสภาพแวดวงการ: สามารถให้ความยืดหยุ่นในการควบคุมในสภาพแวดวงการหรือสภาพแวดวงอื่นๆ ที่ความยืดหยุ่นในการใช้เครื่องมือต่างๆ น้อย
3.การพัฒนาแอปพลิเคชัน: นักพัฒนาสามารถนำ AI Virtual Mouse ไปประยุกต์ใช้ในการพัฒนาแอปพลิเคชันที่ต้องการควบคุมโดยใช้ท่าทางหรือการเคลื่อนไหวของมือ
4.การเพิ่มประสิทธิภาพในการทำงาน: สามารถทำให้การทำงานกับเทคโนโลยีและแอปพลิเคชันต่างๆ มีประสิทธิภาพมากขึ้นด้วยการให้ความสามารถในการควบคุมที่สามารถปรับเปลี่ยนได้ตามความต้องการ
ความรู้ที่เกี่ยวข้อง
การสร้างคลาส VirtualMouse
ซึ่งเป็นส่วนหนึ่งของโปรแกรมที่ทำให้เป็นไปได้ที่จะควบคุมเม้าส์เสมือนผ่านการตรวจจับมือโดยใช้กล้องเว็บแคม (webcam). นอกจากนี้ยังมีการใช้ไลบรารีต่าง ๆ ที่มีความเชี่ยวชาญในงานที่ทำให้โค้ดนี้ทำงานได้:
1.PyCharm เป็นสภาพแวดล้อมการพัฒนาแบบบูรณาการที่ใช้สำหรับการเขียนโปรแกรมใน Python มีการวิเคราะห์โค้ด ดีบักเกอร์แบบกราฟิก ตัวทดสอบหน่วยแบบรวม การรวมกับระบบควบคุมเวอร์ชัน และสนับสนุนการพัฒนาเว็บด้วย Django PyCharm
2.OpenCV (cv2): ไลบรารีสำหรับการประมวลผลภาพและวิดีโอ. ในที่นี้ใช้สำหรับเข้าถึงวิดีโอจากกล้องเว็บแคม, แปลงรูปภาพ, และวาดสายลอยบนมือ.
3.MediaPipe: ไลบรารีที่พัฒนาโดย Google สำหรับการตรวจจับและติดตามวิดีโอและภาพ 2D โดยใช้โมเดล Machine Learning เชิงลึก. ในที่นี้ใช้สำหรับตรวจจับมือ.
4.PyAutoGUI: ไลบรารีสำหรับควบคุมเม้าส์และแป้นพิมพ์ผ่าน GUI ของระบบปฏิบัติการ.
5.Class VirtualMouse
: ถูกสร้างขึ้นเพื่อให้โค้ดมีโครงสร้างที่เรียบร้อยและสามารถนำไปใช้งานซ้ำได้. ในนี้มีเมทอด __init__
, process_frame
, run
, และ __del__
สำหรับการกำหนดค่าเริ่มต้น, ประมวลผลเฟรม, รันโปรแกรม, และทำลายอ็อบเจกต์ตอนท้าย, ตามลำดับ.
6.การใช้งานและปรับแต่งตำแหน่ง:
มีการใช้งานคำสั่ง cv2.circle
เพื่อวาดวงกลม (circle) ลงบนภาพที่แสดง.
ใช้ pyautogui.moveTo
เพื่อย้ายตำแหน่งของเม้าส์.
ตรวจสอบเงื่อนไขที่ใช้ในการคลิกเม้าส์ (ถ้ามี) โดยใช้ pyautogui.click
.
7.Looping (while True
): มีการใช้ลูป while True
เพื่อให้โปรแกรมทำงานตลอดเวลา.
8.การทำความเข้าใจกับระบบสัมผัส (Conditional Statements): มีการใช้คำสั่ง if
เพื่อตรวจสอบเงื่อนไขและทำงานตาม.
9.การทำงานกับรูปแบบและตัวแปรทางคลาส (Class Methods and Variables): การใช้ self
เพื่ออ้างอิงถึงตัวแปรและเมทอดทางคลาส.
10.การปรับแต่งการแสดงผลใน GUI (cv2.imshow
): การใช้ OpenCV เพื่อแสดงภาพและการใช้ cv2.waitKey
เพื่อรอการป้อนข้อมูลจากแป้นพิมพ์
ไลบรารี
ที่ต้องดาวโหลด
1.opencv-python
2.mediapipe
3.pyautogui
ถ้าเวอชัน python ไม่ตรง
protobuf
โค็ด
import cv2
import mediapipe as mp
import pyautogui
class VirtualMouse:
def init(self):
self.cap = cv2.VideoCapture(1)
self.hand_detector = mp.solutions.hands.Hands()
self.drawing_utils = mp.solutions.drawing_utils
self.screen_width, self.screen_height = pyautogui.size()
self.index_y = 0
def process_frame(self, frame):
frame_height, frame_width, _ = frame.shape
rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
output = self.hand_detector.process(rgb_frame)
hands = output.multi_hand_landmarks
if hands:
for hand in hands:
self.drawing_utils.draw_landmarks(frame, hand)
landmarks = hand.landmark
for id, landmark in enumerate(landmarks):
x = int(landmark.x * frame_width)
y = int(landmark.y * frame_height)
if id == 8:
cv2.circle(img=frame, center=(x, y), radius=10, color=(0, 255, 255))
index_x = self.screen_width / frame_width * x
self.index_y = self.screen_height / frame_height * y
pyautogui.moveTo(index_x, self.index_y)
if id == 4:
cv2.circle(img=frame, center=(x, y), radius=10, color=(0, 255, 255))
thumb_x = self.screen_width / frame_width * x
thumb_y = self.screen_height / frame_height * y
if abs(self.index_y - thumb_y) < 20:
pyautogui.click()
pyautogui.sleep(1)
cv2.imshow('Virtual mouse', frame)
cv2.waitKey(1)
def run(self):
while True:
_, frame = self.cap.read()
frame = cv2.flip(frame, 1)
self.process_frame(frame)
def __del__(self):
self.cap.release()
cv2.destroyAllWindows()
if name == "main":
mouse_controller = VirtualMouse()
mouse_controller.run()
ผลดำเนิดการ
__init__
Method: ทำการกำหนดค่าเริ่มต้นเมื่อคลาสถูกสร้างขึ้น:- เปิดกล้องเว็บแคม (
self.cap = cv2.VideoCapture(1)
). - สร้างตัวตรวจจับมือจาก MediaPipe (
self.hand_detector = mp.solutions.hands.Hands()
). - กำหนดความสูงและความกว้างของหน้าจอ (
self.screen_width, self.screen_height = pyautogui.size()
). - กำหนดตำแหน่งเริ่มต้นของความสูงของปลายนิ้วชี้ (
self.index_y = 0
).
- เปิดกล้องเว็บแคม (
process_frame
Method: ทำการประมวลผลทุกรูปภาพที่ได้รับจากกล้อง:- แปลงสีของภาพเป็นรูปแบบ RGB.
- ให้ตรวจจับมือด้วยตัวตรวจจับมือของ MediaPipe.
- หาตำแหน่งของมาร์กแลนด์บนมือและแสดงบนภาพ.
- นำตำแหน่งของมาร์กแลนด์บนมือมาแปลงเป็นตำแหน่งบนหน้าจอและย้ายเม้าส์ไปยังตำแหน่งที่ได้.
run
Method: ทำให้โปรแกรมทำงานตลอดเวลา โดยอ่านภาพจากกล้องและส่งไปยังprocess_frame
.__del__
Method: ทำลายอ็อบเจกต์และปิดกล้องเว็บแคมเมื่อโปรแกรมถูกปิด.__main__
Block: สร้างอ็อบเจกต์ของVirtualMouse
และเรียกใช้เมทอดrun
เพื่อเริ่มการทำงานของโปรแกรม.
การทำงานของโค้ดนี้จะทำให้กล้องเว็บแคมทำงานและแสดงภาพบนหน้าจอ. เมื่อมือถูกตรวจจับ, มาร์กแลนด์บนมือจะถูกวาดบนภาพและเม้าส์เสมือนจะถูกย้ายไปยังตำแหน่งที่มืออยู่. หากมือทำสัญญาณว่ามีการคลิก (ยกนิ้วชี้และนิ้วหัวแม่มือ), โปรแกรมจะทำการคลิกเม้าส์แต่ยังมาการทำงานที่ช้าอยู่บ้าง.
สรุปผล
- การตรวจจับมือ: โปรแกรมใช้ไลบรารี MediaPipe เพื่อตรวจจับและติดตามมือในภาพที่ได้รับจากกล้องเว็บแคม.
- การควบคุมเม้าส์: โปรแกรมทำให้เม้าส์เสมือนถูกควบคุมตามตำแหน่งของมาร์กแลนด์บนมือที่ถูกตรวจจับ.
- การคลิกเม้าส์: โปรแกรมจะทำการคลิกเม้าส์เมื่อมีสัญญาณว่ามีการคลิก (ยกนิ้วชี้และนิ้วหัวแม่มือ).
- การนำเข้าและใช้งานไลบรารี: โค้ดนำเข้าและใช้งานไลบรารีต่าง ๆ เช่น OpenCV, MediaPipe, และ PyAutoGUI เพื่อทำให้โปรแกรมมีความสามารถที่ต้องการ.
- การใช้งาน Object-Oriented Programming (OOP): โปรแกรมใช้คลาส
VirtualMouse
เพื่อจัดการโค้ดและเมทอดต่าง ๆ.
ผลลัพธ์ที่คาดหวังคือการสร้างเมาส์เสมือนที่สามารถควบคุมได้ด้วยมือผ่านกล้องเว็บแคม. ผู้ใช้สามารถเลื่อนเม้าส์, คลิก, และทำงานกับแอปพลิเคชันหรือโปรแกรมต่าง ๆ โดยใช้มือเพียงอย่างเดียว.
ข้อมูลอ้างอิง
โค็ด
https://github.com/ProgrammingHero1/virtual_mouse
โปรแกรม
https://www.jetbrains.com/pycharm/download/?section=windows
Python
https://aws.amazon.com/th/what-is/python/
วีดีโอ