Raspberry Pi: Hệ thống camera giám sát phát hiện chuyển động và thông báo qua Telegram
Trung cấp12/3/2024

Raspberry Pi: Hệ thống camera giám sát phát hiện chuyển động và thông báo qua Telegram

Xây dựng camera giám sát sử dụng Camera Module v3 của Raspberry Pi, tích hợp phát hiện chuyển động bằng OpenCV và gửi ảnh chụp tự động qua Telegram Bot.

CameraOpenCVTelegramSecurityRaspberry Pi
687 lượt thích445 người đã làm1 giờ6 bước4 linh kiện
← Quay lại dự án
Hướng dẫn chi tiết

Phần 3: Phát hiện chuyển động bằng OpenCV

1. Giới thiệu OpenCV và cách cài đặt thư viện, 2. Lập trình script Python để phát hiện chuyển động, 3. Sử dụng các hàm xử lý ảnh cơ bản (như chuyển đổi ảnh màu sang ảnh xám), 4. Thiết lập ngưỡng phát hiện chuyển động, 5. Ghi lại thời gian và ảnh khi phát hiện chuyển động.

Cập nhật 01/06/2026

Phần 3: Phát hiện chuyển động bằng OpenCV

Trong phần này, chúng ta sẽ tìm hiểu cách sử dụng OpenCV để phát hiện chuyển động trong video từ camera giám sát. OpenCV là một thư viện mã nguồn mở mạnh mẽ cho xử lý ảnh và video, giúp chúng ta dễ dàng thực hiện các tác vụ như phát hiện chuyển động.

1. Giới thiệu OpenCV và cách cài đặt thư viện

OpenCV (Open Source Computer Vision Library) là một thư viện phổ biến cho các ứng dụng xử lý ảnh và video. Nó cung cấp nhiều chức năng mạnh mẽ, bao gồm phát hiện đối tượng, nhận diện khuôn mặt, và phát hiện chuyển động. Để sử dụng OpenCV trong dự án của chúng ta, trước tiên chúng ta cần cài đặt thư viện này trên Raspberry Pi.

sudo apt update
sudo apt install python3-opencv

Để xác nhận rằng OpenCV đã được cài đặt thành công, bạn có thể chạy lệnh sau trong Python:

python3 -c "import cv2; print(cv2.__version__)"

Nếu bạn thấy phiên bản của OpenCV hiển thị, có nghĩa là việc cài đặt đã thành công.

2. Lập trình script Python để phát hiện chuyển động

Chúng ta sẽ viết một script Python đơn giản để phát hiện chuyển động từ camera. Script này sẽ sử dụng camera để lấy khung hình liên tục và so sánh chúng để xác định xem có chuyển động hay không.

import cv2

# Khởi tạo camera
cap = cv2.VideoCapture(0)

# Đặt biến để lưu khung hình trước đó
previous_frame = None

while True:
    # Đọc khung hình từ camera
    ret, frame = cap.read()
    if not ret:
        break

    # Chuyển đổi khung hình sang ảnh xám
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Làm mờ ảnh để giảm nhiễu
    gray_frame = cv2.GaussianBlur(gray_frame, (21, 21), 0)

    # Nếu không có khung hình trước đó, lưu khung hình hiện tại
    if previous_frame is None:
        previous_frame = gray_frame
        continue

    # Tính toán sự khác biệt giữa khung hình hiện tại và khung hình trước đó
    frame_delta = cv2.absdiff(previous_frame, gray_frame)

    # Ngưỡng để phát hiện chuyển động
    threshold_frame = cv2.threshold(frame_delta, 25, 255, cv2.THRESH_BINARY)[1]

    # Tìm các vùng chuyển động
    contours, _ = cv2.findContours(threshold_frame.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # Hiển thị khung hình
    cv2.imshow("Camera", frame)

    # Cập nhật khung hình trước đó
    previous_frame = gray_frame

    # Nhấn 'q' để thoát
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

3. Sử dụng các hàm xử lý ảnh cơ bản

Trong script trên, chúng ta đã sử dụng một số hàm xử lý ảnh cơ bản như:

  • cv2.cvtColor(): Chuyển đổi ảnh màu sang ảnh xám.
  • cv2.GaussianBlur(): Làm mờ ảnh để giảm nhiễu.
  • cv2.absdiff(): Tính toán sự khác biệt giữa hai khung hình.
  • cv2.threshold(): Thiết lập ngưỡng để phát hiện chuyển động.
  • cv2.findContours(): Tìm các vùng có chuyển động trong khung hình.

4. Thiết lập ngưỡng phát hiện chuyển động

Ngưỡng phát hiện chuyển động có thể được điều chỉnh bằng cách thay đổi giá trị trong hàm cv2.threshold(). Nếu giá trị ngưỡng quá thấp, có thể sẽ phát hiện nhiều chuyển động không mong muốn (như sự thay đổi ánh sáng). Ngược lại, nếu ngưỡng quá cao, có thể bỏ qua những chuyển động thực sự. Bạn nên thử nghiệm với các giá trị khác nhau để tìm ra ngưỡng phù hợp nhất cho môi trường của mình.

Mẹo: Hãy thử nghiệm với các giá trị ngưỡng khác nhau trong khoảng từ 20 đến 50 để tìm ra giá trị tối ưu cho môi trường của bạn.

5. Ghi lại thời gian và ảnh khi phát hiện chuyển động

Để ghi lại thời gian và lưu ảnh khi phát hiện chuyển động, chúng ta có thể mở rộng script như sau:

import cv2
import datetime

cap = cv2.VideoCapture(0)
previous_frame = None

while True:
    ret, frame = cap.read()
    if not ret:
        break

    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gray_frame = cv2.GaussianBlur(gray_frame, (21, 21), 0)

    if previous_frame is None:
        previous_frame = gray_frame
        continue

    frame_delta = cv2.absdiff(previous_frame, gray_frame)
    threshold_frame = cv2.threshold(frame_delta, 25, 255, cv2.THRESH_BINARY)[1]
    contours, _ = cv2.findContours(threshold_frame.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # Kiểm tra xem có chuyển động không
    if len(contours) > 0:
        # Ghi lại thời gian
        timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        print(f"Phát hiện chuyển động tại: {timestamp}")

        # Lưu ảnh
        cv2.imwrite(f"motion_{timestamp}.jpg", frame)

    cv2.imshow("Camera", frame)
    previous_frame = gray_frame

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Trong đoạn mã trên, khi phát hiện chuyển động, chúng ta ghi lại thời gian hiện tại và lưu ảnh với tên có chứa thời gian. Điều này sẽ giúp bạn dễ dàng theo dõi các sự kiện đã xảy ra.

Với các bước trên, bạn đã có thể thiết lập hệ thống phát hiện chuyển động cơ bản bằng OpenCV. Trong phần tiếp theo, chúng ta sẽ tìm hiểu cách gửi thông báo qua Telegram khi phát hiện chuyển động.