โปรแกรมตรวจจับการเคลื่อนไหวพร้อมกับจับภาพ motion detection with python3

ผู้เขียนบทความ นายณัฐวีร์ จันทร์ปรุงตน COE#12

1.ความเป็นมา

ความเป็นมาของโครงงานโปรแกรมตรวจจับการเคลื่อนไหวโดยพร้อมกับจับภาพโดยใช้ python นั้นเกิดจากการที่ตัวผู้ศึกษานั้นอยากจะให้การทำงานของ open cv กับ Face detection ของการเขียนโปรแกรม python นั้นทำงานได้โดยมีเงื่อนไขในการทำงานคือสามารถตรวจจับการเคลื่อนไหวพร้อมทั้งจับภาพไปด้วยในคราวเดียวกันจึงไปศึกษาค้นคว้าหาข้อมูลแล้วนำความรู้ที่ได้มาเขียนโปรแกรมในการทำโครงงานอันนี้

2.วัตถุประสงค์

-เพื่อศึกษาหาความรู้ในการใช้ภาษา python

-เพื่อใช้ภาษา python ในการตรวจจับการเคลื่อนไหวในลักษณะเดียวกับกล้องวงจรปิด

-เพื่อให้โครงงานนั้นใช้ได้จริงและเกิดประโยชน์สูงสุด

3.ขอบเขต

-สามารถใช้ได้จริงทำงานได้จริงและสามารถนำไปประยุกต์ใช้กับโปรแกรมอื่นได้

-สามารถใช้ภาษา python ในการเขียนโปรอแกรมที่สามารถใช้งานได้จริง

-สามารถเรียนรู้การเขียนโปรแกรมที่ใช้งานภาษา python ได้อย่างหลากหลาย

4.ประโยชน์ที่คาดว่าจะได้รับ

-ได้ความรู้ในการนำภาษา python มาประยุกต์ใช้

-สามารถนำโปรแกรมที่เขียนนั้นไปใช้ได้จริง

-สามารถต่อยอดการเขียนโปรแกรมที่ใช้ภาษา python ได้

5.ความรู้ที่เกี่ยวข้อง

5.1 การใช้ Module ต่างๆในการเขียนโปรแกรมใช้งาน python motion detection มีดังนี้

  1. ลง opencv2 โดยการ pip install OpenCV-python
    1.2 อธิบาย library opencv2 คือ OpenCV (open-source computer Vision) เป็นไลบารีฟังชันการเขียนโปรแกรม (library Programming Functions) โดยไลบารีตัวนี้นั้นจะมุ่งเน้นไปที่การแสดงผลด้วยคอมพิวเตอร์แบบเรียลไทม์ (Real-Time Computer Vision) ถูกเขียนด้วยภาษา C++ มีการลองรับภาษา python , ภาษา Java และ MATLAB/OCTAVE -API
    1.3 การใช้ประโยชน์
    -ชุดเครื่องมือคุณลักษณะ 2 มิติและ 3 มิติ (2D and 3D feature toolkits)
    -การประมาณระยะในขณะเคลื่อนที่ (Ego motion Estimation)
    -ระบบรู้จำใบหน้า (Facial recognition system)
    -การจดจำท่าทาง (Gesture recognition)
    -ปฏิสัมพันธ์ระหว่างมนุษย์และคอมพิวเตอร์ (Human-Computer interaction : HCI)
  2. ลง pandas โดยการ pip install pandas
    2.1 อธิบาย library pandas Pandas นั้นคือ Library หนึ่งในภาษา Python ที่ทำให้เราสามารถจัดการข้อมูลต่างๆได้ง่ายขึ้น เช่น การโหลดข้อมูลไฟล์ CSV เข้ามาแล้วแสดงข้อมูลให้ออกมาในรูปแบบคล้ายกับ Table โดยมีการแบ่งข้อมูลเป็น Row กับ Column เราเรียกสิ่งนี้ว่า Data Frame
    2.2 โดยมีการเรียกใช้คำสั่งดังนี้
    – การอ่านไฟล์ คำสั่ง—> .raed_csv (ชื่อไฟล์ .csv)
    -การดูข้อมูลจากแถวลนสุด คำสั่ง—> .head (จำนวน ROW ที่อยากได้ออกมาแสดงนับจากแถวบนสุด)
    -การดูข้อมูลจากแถวล่างสุด คำสั่ง—> .tail (จำนวน ROW ที่อยากได้ออกมาแสดงนับจากแถวล่างสุด)
    -การเรียกดูข้อมูลแบบสุ่ม คำสั่ง—>.sample (จำนวนแถวที่ต้องการ)
    -การเช็คความผิดปกติใน Data Frame คำสั่ง—> .info()
    -การแปลงชนิดข้อมูล คำสั่ง—>.astype (ชนิข้อมูลที่ต้องการ)
    -การสร้าง categories คำสั่ง—> .categories()
    2.3 อันนี้เป็นคำสั่งหลักที่ใช้ในตัวโปรแกรม ถ้าหากอยากได้ค่า วันที่และเวลา ใน pandas เองก็มีคำสั่งที่ช่วยอำนวยความสะดวกสบายเอาไว้เช่นกัน คือ .date_rang() โดย date_range นั้นมีความสามารถที่ทำให้เราสามารถเพิ่มค่าเองได้ตั้งแต่หน่วยเวลา ไปจนถึงหน่วยวัน พร้อมกับกำหนด timezone เองได้ด้วยเช่นกัน
    -คำสั่งแบบเพิ่มค่าที่หน่วยเวลานั้นสามารถทำได้โดย คำสั่งนี้—> .date_rang(start,end,freq)
รูปที่ 1 แสดงถึงคำสั่งที่ใช้ลง Module open cv เพื่อใช้ในการเขียนโปรแกรม
รูปที่ 2 แสดงถึงคำสั่งที่ใช้ลง Module pandas เพื่อใช้ในการเขียนโปรแกรม

5.2 การเตรียมการความต้องการของระบบ

-การใช้งาน Module open cv นั้นต้องเรียกเรียกคำสั่งใช้งานนั้นก็คือ import cv2 เพื่อใช้ในการเรียกใช้งานกล้อง Webcam หรืออุปกรณ์กล้องต่างๆเท่าที่ตัวโปรแกรมจะตรวจจับได้

5.3 ขั้นตอนต่อไปเป็นการเริ่มเขียนโปรแกรม

ตัว Code program


import cv2
import time
import pandas

from datetime import datetime

static_back = None
motion_list = [None, None]
time = []
df = pandas.DataFrame(columns=["Start", "End"])
video = cv2.VideoCapture(0)
success, image = video.read()
while True:
    check, frame = video.read()
    motion = 0
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray, (21, 21), 0)
    if static_back is None:
         static_back = gray
         continue
    diff_frame = cv2.absdiff(static_back, gray)
    thresh_frame = cv2.threshold(diff_frame, 30, 255, cv2.THRESH_BINARY)[1]
    thresh_frame = cv2.dilate(thresh_frame, None, iterations=2)
    cnts, _ = cv2.findContours(thresh_frame.copy(),
                                cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for contour in cnts:
        if cv2.contourArea(contour) < 10000:
            continue
        motion = 1
        count = 1
        cv2.imwrite("frame%d.jpg" % count, image)
        success,image = video.read()
        count += 1
        (x, y, w, h) = cv2.boundingRect(contour)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 3)
    motion_list.append(motion)
    motion_list = motion_list[-2:]

    if motion_list[-1] == 1 and motion_list[-2] == 0:
        time.append(datetime.now())
    if motion_list[-1] == 0 and motion_list[-2] == 1:
        time.append(datetime.now())
    cv2.imshow("Gray Frame", gray)
    cv2.imshow("Difference Frame", diff_frame)
    cv2.imshow("Threshold Frame", thresh_frame)
    cv2.imshow("Color Frame", frame)
    key = cv2.waitKey(1)
    if key == ord('q'):
        if motion == 1:
            time.append(datetime.now())
        break
for i in range(0, len(time), 2):
    df = df.append({"Start": time[i], "End": time[i + 1]}, ignore_index=True)
df.to_csv("Time_of_movements.csv")
video.release
cv2.destroyAllWindows  

6.ผลการดำเนินงาน

รูปที่ 3 ผลการทดลอง
รูปที่ 4 แสดงผลการบันทึกภาพหน้าจอ
รูปที่ 5 แสดงการบันทึกเวลาการเคลื่อนไหวของวัตถุ
รูปที่ 6 แสดงผังการทำงานของโปรแกรม

7.สรุปผลข้อเสนอแนะ

-ตัวโปรแกรมเป็นไปตามความต้องการของผู้ดำเนินการศึกษาแต่ตัวโปรแกรมนั้นยังไม่สามารถแสดงผลผ่านระบบออนไลน์ถ้าต้องการเสริมนั้นให้ผู้ที่เข้ามาเยี่ยมชมไปศึกษาการเอาค่าทั้งหมดไปแสดงผลผ่านเว็ปไซต์ออนไลน์ได้ละสามารถนำไปต่อยอดได้อีกครับ ขอบคุณครับ

8.ข้อมูลอ้างอิง

Website อ้างอิงการศึกษา

WebCam Motion Detector in Python – GeeksforGeeks

Share

You may also like...

Leave a Reply