ผู้เขียนบทความ นายณัฐวีร์ จันทร์ปรุงตน 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 มีดังนี้
- ลง 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) - ลง 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)
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.ผลการดำเนินงาน

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