ตัวอย่างบทเรียนการใช้ Python และ OpenCV และ Numpy ตรวจจับร่างกายคน Human Body Detection แบบ Real-Time แล้วบันทึกเป็นไฟล์ Video
ก่อนจะทำความเข้าใจบทเรียนนี้แนะนำให้ไปศึกษาบทเรียนต่อไปนี้ก่อน
ทำการตรวจสอบความพร้อมของโปรแกรมเป็นที่เรียบร้อยแล้วก็เปิด Visual Studio Code หรือ IDE ตัวอื่นๆ ขึ้นมาได้เลยครับ หลังจากนั้นให้ทำการประกาศ
import numpy as np import cv2
แน่นอนว่าเราต้องใช้ NumPy ช่วยเพราะมันเป็น library ที่ใช้ในการคำนวนทางคณิตศาสตร์โดยภายในถูกเขียนด้วยภาษา C จึงทำงานได้เร็วและมีประสิทธิภาพ แล้วขยายมาเขียนร่วมกับ Python โดย NumPy มีความสามารถในการจัดการกับ Array หลายมิติและข้อมูลแบบ Matrix
เขียนฟังก์ชันการตรวจจับบุคคลในท่าทางต่างๆ โดยใช้คุณสมบัติ HOG และตัวแยกประเภท SVM Classifies ในการช่วย
hog = cv2.HOGDescriptor() hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
คุณสมบัติ HOG และ SVM Classifies นี่ เป็นการศึกษาการตรวจจับ ร่างกายคน หรือบุคคลที่รวดเร็วและเชื่อถือได้ (แม้จะอยู่ในท่าทางที่แตกต่างกันไปในภาพ หรือสื่อวีดีโอ) ผ่านการจับโดยกล้อง กล้องวิดีโอ หรือจากกล้อง WebCam ที่ดีคือทำงานแบบเรียลไทม์ (Real-Time) ซึ่งเป็นหัวใจหลักของการทำ Computer Vision มานานแล้วครับ ใช้กับการเล่นเกม การโต้ตอบระหว่างมนุษย์กับคอมพิวเตอร์ การรักษาความปลอดภัย การแสดงตนทางไกล และแม้แต่การดูแลสุขภาพ การตรวจจับบุคคลในภาพ วิดีโอ และจากเว็บแคมแบบเรียลไทม์ที่บุคคลอาจอยู่ในอิริยาบถต่างๆ เช่น ยืน นั่ง นอน ก้มตัว มากมาย
ตัวตรวจจับคนด้วย HOG จะมีการคำนวณ HOG descriptor เป็น Windows หมุนรอบๆ บุคคล เพื่อเข้ากระบวนการตรวจจับกราฟิก โดยจะส่งคำอธิบาย (Descriptor) นี้ต่อให้กับคุณสมบัติ SVM ที่ได้รับการ Train มาเป็นที่เรียบร้อยแล้วว่าข้อมูลที่ส่งนั้นเป็น “มนุษย์” หรือ “ไม่ใช่มนุษย์”
cv2.startWindowThread() cap = cv2.VideoCapture(0)
ทำการ Start Windows สร้างหน้าต่างแสดงผล และจับภาพจากกล้องแบบ Real-Time ผ่าน OpenCV
out = cv2.VideoWriter('output.avi',cv2.VideoWriter_fourcc(*'MJPG'),15.,(1280,720))
เขียนคำสั่งด้านบนเพื่อทำการ จับภาพและบันทึกเป็นไฟล์ Video ชื่อ output.avi เข้ารหัสด้วย ffmpeg ขนาด 1280×720 pixels เพื่อแสดง OutPut ครับ
while(True): # จับภาพแบบ frame-by-frame ret, frame = cap.read() # resizing กล้อง frame = cv2.resize(frame, (1280, 720)) # ทำ Grayscale ให้กับกราฟิกก่อน gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) # ตรวจจับคนในภาพ หรือกล้องแล้ววาดกราฟิก boxes, weights = hog.detectMultiScale(frame, winStride=(8,8) ) boxes = np.array([[x, y, x + w, y + h] for (x, y, w, h) in boxes]) for (xA, yA, xB, yB) in boxes: # สร้าง Detect Box สีเขียวรอบๆ ตัวคน cv2.rectangle(frame, (xA, yA), (xB, yB), (0, 255, 0), 2) # เขียนไฟล์ output.avi out.write(frame.astype('uint8')) # แสดงผล Frame cv2.imshow('frame',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break
กด Q เพื่อยกเลิกโปรแกรมจะทำการปล่อย Process ทั้งหมดดังนี้
# ปิดระบบกล้อง cap.release() # ปิดการเขียน output out.release() cv2.destroyAllWindows() cv2.waitKey(1)
ไฟล์ทั้งหมดเป็นแบบนี้ครับ:
import numpy as np import cv2 hog = cv2.HOGDescriptor() hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) cv2.startWindowThread() # open webcam video stream cap = cv2.VideoCapture(0) # output.avi out = cv2.VideoWriter( 'output.avi', cv2.VideoWriter_fourcc(*'MJPG'), 15., (1280,720)) while(True): ret, frame = cap.read() frame = cv2.resize(frame, (1280, 720)) gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) boxes, weights = hog.detectMultiScale(frame, winStride=(8,8) ) boxes = np.array([[x, y, x + w, y + h] for (x, y, w, h) in boxes]) for (xA, yA, xB, yB) in boxes: cv2.rectangle(frame, (xA, yA), (xB, yB), (0, 255, 0), 2) out.write(frame.astype('uint8')) cv2.imshow('frame',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() out.release() cv2.destroyAllWindows() cv2.waitKey(1)
ทีนี้ก็มาทดสอบกัน
Output ไฟล์ วีดีโออยู่ที่นี่
เรียบร้อยครับการทำ Machine Learning ด้วยการใช้ Python และ OpenCV และ Numpy ตรวจจับร่างกายคน Human Body Detection แบบ Real-Time แล้วบันทึกเป็นไฟล์ Video