ระบบโต้ตอบและสั่งการคอมพิวเตอด้วยการประเมินผลภาพ

ผู้เขียนบทความ:นายชยธร เรืองณรงค์ 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()

ผลดำเนิดการ

  1. __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).
  2. process_frame Method: ทำการประมวลผลทุกรูปภาพที่ได้รับจากกล้อง:
    • แปลงสีของภาพเป็นรูปแบบ RGB.
    • ให้ตรวจจับมือด้วยตัวตรวจจับมือของ MediaPipe.
    • หาตำแหน่งของมาร์กแลนด์บนมือและแสดงบนภาพ.
    • นำตำแหน่งของมาร์กแลนด์บนมือมาแปลงเป็นตำแหน่งบนหน้าจอและย้ายเม้าส์ไปยังตำแหน่งที่ได้.
  3. run Method: ทำให้โปรแกรมทำงานตลอดเวลา โดยอ่านภาพจากกล้องและส่งไปยัง process_frame.
  4. __del__ Method: ทำลายอ็อบเจกต์และปิดกล้องเว็บแคมเมื่อโปรแกรมถูกปิด.
  5. __main__ Block: สร้างอ็อบเจกต์ของ VirtualMouse และเรียกใช้เมทอด run เพื่อเริ่มการทำงานของโปรแกรม.

การทำงานของโค้ดนี้จะทำให้กล้องเว็บแคมทำงานและแสดงภาพบนหน้าจอ. เมื่อมือถูกตรวจจับ, มาร์กแลนด์บนมือจะถูกวาดบนภาพและเม้าส์เสมือนจะถูกย้ายไปยังตำแหน่งที่มืออยู่. หากมือทำสัญญาณว่ามีการคลิก (ยกนิ้วชี้และนิ้วหัวแม่มือ), โปรแกรมจะทำการคลิกเม้าส์แต่ยังมาการทำงานที่ช้าอยู่บ้าง.

สรุปผล

  1. การตรวจจับมือ: โปรแกรมใช้ไลบรารี MediaPipe เพื่อตรวจจับและติดตามมือในภาพที่ได้รับจากกล้องเว็บแคม.
  2. การควบคุมเม้าส์: โปรแกรมทำให้เม้าส์เสมือนถูกควบคุมตามตำแหน่งของมาร์กแลนด์บนมือที่ถูกตรวจจับ.
  3. การคลิกเม้าส์: โปรแกรมจะทำการคลิกเม้าส์เมื่อมีสัญญาณว่ามีการคลิก (ยกนิ้วชี้และนิ้วหัวแม่มือ).
  4. การนำเข้าและใช้งานไลบรารี: โค้ดนำเข้าและใช้งานไลบรารีต่าง ๆ เช่น OpenCV, MediaPipe, และ PyAutoGUI เพื่อทำให้โปรแกรมมีความสามารถที่ต้องการ.
  5. การใช้งาน 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/

วีดีโอ

You may also like...

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *