Demo AI – Computer Vision trong thực tế tại Đà Nẵng | Bài toán đếm xe

Demo AI – Computer Vision trong thực tế tại Đà Nẵng | Bài toán đếm xe

Trong những năm gần đây, AI & Computer Vision không còn là thứ quá xa vời. Từ camera giao thông, camera an ninh, bãi giữ xe thông minh cho đến các hệ thống đô thị thông minh (Smart City), việc phân tích hình ảnh & video đang được ứng dụng rất mạnh.

Tại Đà Nẵng, một thành phố đang hướng tới đô thị thông minh, bài toán:

  • Đếm lưu lượng xe

  • Phân tích mật độ giao thông

  • Hỗ trợ điều tiết giao thông

  • Thu thập dữ liệu phục vụ quy hoạch

👉 đều là những ứng dụng AI rất thực tế.

Trong bài viết này, AIDaNang.com sẽ hướng dẫn bạn:

✅ Làm demo đếm xe bằng Python
✅ Không cần AI nặng, không cần GPU
✅ Chạy được trên máy cá nhân
✅ Hiển thị trực tiếp số lượng xe trên video

Phù hợp cho:

  • Người mới học AI

  • Sinh viên CNTT

  • Lập trình viên muốn làm demo nhanh

  • Người muốn hiểu AI ứng dụng thực tế


2. Tổng quan giải pháp

2.1 Chúng ta sẽ làm gì?

Xây dựng một chương trình Python có khả năng:

  • Đọc video giao thông (hoặc webcam)

  • Phát hiện các vật thể đang di chuyển (xe)

  • Xác định khi xe cắt qua một đường đếm

  • Tăng biến đếm và hiển thị kết quả trực tiếp

2.2 Công nghệ sử dụng

Thành phần Công nghệ
Ngôn ngữ Python
Xử lý ảnh OpenCV
Thuật toán Background Subtraction
AI nặng ❌ Không dùng
GPU ❌ Không cần

👉 Đây là Computer Vision cổ điển, cực kỳ phù hợp để học nền tảng.


3. Chuẩn bị môi trường

3.1 Cài đặt Python

Khuyến nghị:

  • Python 3.8 – 3.11

  • Kiểm tra bằng lệnh:

python --version

3.2 Cài thư viện cần thiết

pip install opencv-python numpy

Giải thích nhanh:

  • opencv-python: xử lý video, ảnh

  • numpy: xử lý mảng, hỗ trợ tính toán


4. Chuẩn bị dữ liệu video

4.1 Video như thế nào là phù hợp?

Để demo chạy ổn, bạn nên chọn video:

✅ Camera cố định
✅ Góc quay không rung
✅ Xe chạy ngang hoặc chéo khung hình
❌ Không nên quay cầm tay

Ví dụ:

  • Camera giao thông

  • Video giao lộ

  • Đường lớn tại Đà Nẵng như: Điện Biên Phủ, Nguyễn Văn Linh…


5. Nguyên lý hoạt động

5.1 Background Subtraction là gì?

Background Subtraction là kỹ thuật:

So sánh khung hình hiện tại với nền (background) để phát hiện vật thể chuyển động.

OpenCV cung cấp sẵn:

cv2.createBackgroundSubtractorMOG2()

Nó sẽ:

  • Học nền theo thời gian

  • Những gì di chuyển sẽ được tách ra → xem như xe


5.2 Cách đếm xe

  1. Phát hiện vùng chuyển động

  2. Vẽ bounding box quanh xe

  3. Tính tâm xe

  4. Nếu tâm xe cắt qua đường đếm → +1


6. Code main.py hoàn chỉnh

👉 Copy toàn bộ file dưới đây, lưu thành main.py

import cv2
import numpy as np

VIDEO_SOURCE = “traffic.mp4″ # đổi thành 0 nếu dùng webcam
LINE_POSITION = 300
MIN_WIDTH = 40
MIN_HEIGHT = 40

def center(x, y, w, h):
return x + w // 2, y + h // 2

cap = cv2.VideoCapture(VIDEO_SOURCE)
bg_subtractor = cv2.createBackgroundSubtractorMOG2()

vehicles = []
count = 0

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

frame = cv2.resize(frame, (800, 450))
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 5)

fgmask = bg_subtractor.apply(blur)
_, thresh = cv2.threshold(fgmask, 200, 255, cv2.THRESH_BINARY)

kernel = np.ones((5, 5), np.uint8)
dilated = cv2.dilate(thresh, kernel, iterations=2)

contours, _ = cv2.findContours(
dilated, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE
)

cv2.line(frame, (0, LINE_POSITION), (800, LINE_POSITION), (0, 255, 255), 2)

for cnt in contours:
x, y, w, h = cv2.boundingRect(cnt)
if w < MIN_WIDTH or h < MIN_HEIGHT:
continue

cx, cy = center(x, y, w, h)
vehicles.append((cx, cy))

cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.circle(frame, (cx, cy), 4, (0, 0, 255), -1)

if LINE_POSITION – 5 < cy < LINE_POSITION + 5:
count += 1
vehicles.remove((cx, cy))

cv2.putText(
frame,
f”Vehicle Count: {count}”,
(20, 40),
cv2.FONT_HERSHEY_SIMPLEX,
1,
(0, 0, 255),
3,
)

cv2.imshow(“Vehicle Counting – AIDaNang”, frame)

if cv2.waitKey(30) & 0xFF == 27:
break

cap.release()
cv2.destroyAllWindows()

7. Chạy chương trình

python main.py

Kết quả:

  • Video hiển thị

  • Số lượng xe tăng khi xe cắt đường đếm

8. Lỗi thường gặp & cách xử lý

❌ Đếm mãi bằng 0

Nguyên nhân:

  • Đường đếm đặt sai vị trí

  • Xe không cắt ngang

👉 Điều chỉnh:

LINE_POSITION = 250

❌ Xe nhỏ không được đếm

👉 Giảm ngưỡng lọc:

MIN_WIDTH = 30
MIN_HEIGHT = 30

❌ Video bị lag

👉 Giảm kích thước:

cv2.resize(frame, (640, 360))

9. Hướng nâng cấp nâng cao

Sau khi làm được demo này, bạn có thể nâng cấp:

🔥 Dùng YOLOv8

  • Phân biệt: xe máy / ô tô / xe tải

  • Đếm chính xác hơn

🔥 Đếm theo làn

  • Mỗi làn một đường đếm

  • Phân tích mật độ giao thông

🔥 Áp dụng thực tế Đà Nẵng

  • Camera giao lộ

  • Dữ liệu cho Smart City

  • Dashboard thống kê

Demo này cho thấy:

✅ AI không quá khó
✅ Python làm được rất nhiều thứ hay
✅ Sinh viên có thể tự học – tự làm
✅ Rất nhiều bài toán thực tế quanh ta

AIDaNang.com mong muốn trở thành nơi:

  • Chia sẻ kiến thức AI dễ hiểu

  • Demo thực tế

  • Kết nối cộng đồng AI tại Đà Nẵng


10. Kết luận

Chỉ với Python + OpenCV, chúng ta đã xây dựng được một demo:

✔️ Đếm xe giao thông
✔️ Hiển thị realtime
✔️ Ứng dụng thực tế rõ ràng

Đây là bước khởi đầu rất tốt để:

  • Tiến sâu hơn vào AI

  • Làm đồ án

  • Xây dựng sản phẩm thực tế

ps: Bạn nào cần file demo thì inbox zalo mình nhé.

Be the first to comment

Leave a Reply

Your email address will not be published.


*