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
Game & Mobile Development AR VR XR
Privacy Overview

This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.

Adblock Detected

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