ผมได้มีโอกาสพัฒนาอีกหนึ่ง 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()