Computer VisionOpenCV

OpenCV จับร่างกายคน Human Body Detection จากกล้องบันทึกเป็น Video

ตัวอย่างบทเรียนการใช้ Python และ OpenCV และ Numpy ตรวจจับร่างกายคน Human Body Detection แบบ Real-Time แล้วบันทึกเป็นไฟล์ Video

ตัวอย่างบทเรียนการใช้ 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

Asst. Prof. Banyapon Poolsawas

อาจารย์ประจำสาขาวิชาการออกแบบเชิงโต้ตอบ และการพัฒนาเกม วิทยาลัยครีเอทีฟดีไซน์ & เอ็นเตอร์เทนเมนต์เทคโนโลยี มหาวิทยาลัยธุรกิจบัณฑิตย์ ผู้ก่อตั้ง บริษัท Daydev Co., Ltd, (เดย์เดฟ จำกัด)

Related Articles

Back to top button

Adblock Detected

เราตรวจพบว่าคุณใช้ Adblock บนบราวเซอร์ของคุณ,กรุณาปิดระบบ Adblock ก่อนเข้าอ่าน Content ของเรานะครับ, ถือว่าช่วยเหลือกัน