Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Chương trình phát hiện chuyển động Webcam bằng Python

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 trình phát hiện chuyển động Webcam bằng Python

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