Trong bài này, chúng ta sẽ viết chương trình Python phân tích hình ảnh từ webcam để phát hiện chuyển động và lưu khoảng thời gian của video webcam vào file CSV.
Thư viện cần thiết
Chúng ta sẽ sử dụng thư viện OpenCV và pandas. Nếu chưa cài đặt, bạn có thể cài bằng pip:
$pip install opencv2, pandas
Mã ví dụ
# Nhập các thư viện cần thiết
import cv2
import pandas as pd
import time
from datetime import datetime
# Khởi tạo biến
stillImage = None
motionImage = [None, None]
time = []
# Khởi tạo DataFrame với cột start và end
df = pd.DataFrame(columns=["start", "end"])
# Bắt video
video = cv2.VideoCapture(0)
while True:
# Đọc hình ảnh từ video
check, frame = video.read()
motion = 0
# Chuyển ảnh màu sang thang độ xám
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (21, 21), 0)
if stillImage is None:
stillImage = gray
continue
# So sánh ảnh nền tĩnh và ảnh hiện tại
diff_frame = cv2.absdiff(stillImage, gray)
# Chuyển ảnh thành trắng nếu nền tĩnh và khung hiện tại khác nhau > 25
thresh_frame = cv2.threshold(diff_frame, 25, 255, cv2.THRESH_BINARY)[1]
thresh_frame = cv2.dilate(thresh_frame, None, iterations=2)
# Tìm contour và hierarchy từ đối tượng chuyển động
contours, hierachy = cv2.findContours(thresh_frame.copy(),
cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
if cv2.contourArea(contour) < 10000:
continue
motion = 1
(x, y, w, h) = cv2.boundingRect(contour)
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 3)
# Thêm trạng thái chuyển động hiện tại
motionImage.append(motion)
motionImage = motionImage[-2:]
# Thêm thời gian bắt đầu chuyển động
if motionImage[-1] == 1 and motionImage[-2] == 0:
time.append(datetime.now())
# Thêm thời gian kết thúc chuyển động
if motionImage[-1] == 0 and motionImage[-2] == 1:
time.append(datetime.now())
# Hiển thị ảnh thang độ xám
cv2.imshow("Gray_Frame", gray)
# Hiển thị khung đen trắng & nếu độ chênh lệch cường độ > 25, chuyển thành trắng
cv2.imshow("Threshold Frame", thresh_frame)
# Hiển thị khung màu
cv2.imshow("Colored_Frame", frame)
key = cv2.waitKey(1)
# Nhấn q để dừng quá trình
if key == ord('q'):
if motion == 1:
time.append(datetime.now())
break
# Thêm thời gian chuyển động
for i in range(0, len(time), 2):
df = df.append({"Start": time[i], "End": time[i + 1]}, ignore_index=True)
# Tạo file CSV lưu thời gian chuyển động
df.to_csv("FrameInMotion_time.csv")
video.release() # đóng cửa sổ
cv2.destroyAllWindows()
Kết quả

Chúng ta thấy 3 cửa sổ hiển thị chuyển động hiện tại từ webcam ở 3 chế độ khác nhau (thang độ xám, màu và đen trắng).
Chương trình cũng lưu ngày giờ chuyển động của webcam vào file CSV, kết quả đầu ra từ CSV sẽ như sau:
FrameMotion_time.csv (đầu ra)
start end End Start 0 2019-02-21 18:10:59.718005 2019-02-21 18:08:35.791487