Alert Detection ( Computer Vision )

ผมได้มีโอกาสพัฒนาอีกหนึ่ง 1 Day Project สั้น ๆ ในช่วงเวลาก่อนขึ้นปีใหม่โดยผมได้ศึกษาเทคโนโลยีที่ผมให้ความสนใจมากที่สุด หรือเทคโนโลยี Computer Vision โดยทำเป็น ระบบตรวจจับสัญญาณมือขอความช่วยเหลือ โดยใช้ลักษณะของฝ่ามือ และนิ้วทั้ง 5 มาแปรผล ผ่านกลไกลการทำงานของระบบ OpenCV และส่วนเสริมต่าง ๆ ซึ่งผลลัพธ์ออกมาอยู่ในเกณฑ์ที่ดี โดยผมได้มีการเก็บข้อมูลความแม่นยำในการทำงาน และแปรผลออกมาเป็นสถิติโดยมีความแม่นยำอยู่ที่ 60% ของการทำงานใน 1 นาที และพบว่าปัจจัยที่ทำให้ผลลัพธ์เพี้ยน หรือการทำงานผิดพลาดเกิดจากแสงไฟ และรูปทรงมือที่ไม่เหมือนกัน จึงทำให้เกิด Error ได้ง่าย ผมจึงได้ทำการแก้ไขเบื้องต้นโดยการใช้เทคนิคการหน่วงเวลา 3 วิ ในการตรวจจับฝ่ามือเพื่อให้เกิดความแม่นยำมากยิ่งขึ้น และทำให้ระบบส่งการแจ้งเตือนที่ผิดพลาดน้อยลงทั้งนี้ผมยังจะต้องพัฒนา Alert Detection ต่อไปเรื่อย ๆ จนกว่าระบบจะสเถียรเพื่อนำความรู้ และประสบการณ์จากจุดเริ่มต้น นำไปพัฒนาโครงการต่อไปที่ผมอยากจะทำต่อในอนาคต

Code <>

import cv2
import requests
import time

# โหลด Haar Cascade Classifier
hand_cascade_path = '/Users/waiyawat/Downloads/haarcase/haarcascades_hand'
hand_cascade = cv2.CascadeClassifier(hand_cascade_path)

time_threshold = 3 #จะ 3 วินาที หรือ 5 ก็ได้แต่เท่าที่ทดสอบล่่าสุด 3 วินาทีให้ผลลัพธ์ที่ดีที่สุด

# เริ่มต้นโปรแกรม
cap = cv2.VideoCapture(0)

# กำหนดขนาดของตรวจจับ
min_size = (100, 100)

# กำหนดขนาดและสีของข้อความ
font_size = 10
font_thickness = 2
font_color_alert = (0, 0, 255)  # สีแดง
font_color_normal = (255, 255, 255)  # สีขาว

# กำหนด Token Line Notify ( มีการเบลอ Token บางส่วนเพื่อความปลอดภัยของข้อมูลครับ )
line_notify_token = "2HkzF50fiXXXXXXXXXXXKwc14byVIIEA5PrgmZ"

# กำหนดตัวแปร line_notify_sent เป็น False เริ่มต้น
line_notify_sent = False

# ฟังก์ชันสำหรับส่งข้อความ Line Notify
def send_line_notify(message):
    global line_notify_sent

    if not line_notify_sent:
        url = "https://notify-api.line.me/api/notify"
        headers = {
            "Authorization": "Bearer " + line_notify_token
        }
        payload = {
            "message": message
        }
        requests.post(url, headers=headers, data=payload)
        line_notify_sent = True

while True:
    
    ret, frame = cap.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # ตรวจจับ 5 นิ้ว
    hands = hand_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=min_size)

    # Check if hands are detected
    if len(hands) > 0:
        if start_time is None:
            start_time = time.time()  # Record the start time when hands are first detected
    else:
        start_time = None  # Reset the start time if no hands are detected

    # Calculate the elapsed time since hands were first detected
    if start_time is not None:
        elapsed_time = time.time() - start_time

        # If elapsed time is greater than the threshold, send Line Notify
        if elapsed_time > time_threshold:
            text = 'Alert'
            text_size = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, font_size, font_thickness)[0]
            text_position = ((frame.shape[1] - text_size[0]) // 2, (frame.shape[0] + text_size[1]) // 2)
            cv2.putText(frame, text, text_position, cv2.FONT_HERSHEY_SIMPLEX, font_size, font_color_alert, font_thickness)

            # ตรวจสอบค่าของตัวแปร line_notify_sent ก่อนส่งข้อความ Line Notify
            if not line_notify_sent:
                send_line_notify("ระบบตรวจจับสัญญาณมือขอความช่วยเหลือกรุณาติดต่อบุคคลที่เกี่ยวข้อง แล้วไปที่จุดเกิดเหตุโดยด่วน! หรือติดต่อเหตุฉุกเฉิน 191")
                line_notify_sent = True
    else:
        text = 'Normal'
        text_size = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, font_size, font_thickness)[0]
        text_position = ((frame.shape[1] - text_size[0]) // 2, (frame.shape[0] + text_size[1]) // 2)
        cv2.putText(frame, text, text_position, cv2.FONT_HERSHEY_SIMPLEX, font_size, font_color_normal, font_thickness)

    # แสดงผลภาพ
    cv2.imshow("Hand Detection", frame)

    # ออกจากโปรแกรมเมื่อกด 'q' กดแล้วจะเด้งออกทันที
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# ปิดกล้อง
cap.release()
cv2.destroyAllWindows()
Facebook
Twitter

คอนเท้นต์ที่คุณน่าจะสนใจ

Scroll to Top