====================================================
ỨNG DỤNG NHẬN DIỆN BIỂN SỐ XE VIỆT NAM (ANPR)
Danh sách chức năng
====================================================
─────────────────────────────────────────────────
1. NHẬN DIỆN BIỂN SỐ
─────────────────────────────────────────────────
[1.1] Mở ảnh qua nút "Mở Ảnh" (hộp thoại chọn file)
[1.2] Kéo & thả file ảnh trực tiếp vào vùng hiển thị
[1.3] Nhận diện biển số 1 dòng (biển dài ô tô)
[1.4] Nhận diện biển số 2 dòng (biển vuông xe máy)
[1.5] Nhận diện nhiều biển số trong cùng một ảnh (tối đa 15 vùng)
[1.6] Hiển thị biển số và độ tự tin (%) ngay trên giao diện
[1.7] Vẽ khung bounding box + nhãn lên ảnh kết quả
[1.8] Xử lý hàng loạt nhiều ảnh cùng lúc (Batch mode)
[1.9] Hỗ trợ định dạng: JPG, JPEG, PNG, BMP, WEBP, TIFF
─────────────────────────────────────────────────
2. XỬ LÝ ẢNH (TIỀN XỬ LÝ)
─────────────────────────────────────────────────
[2.1] Cân bằng sáng tự động (CLAHE) cho ảnh tối/sáng không đều
[2.2] Làm nét ký tự (Unsharp Masking) trước khi OCR
[2.3] Chỉnh nghiêng biển số (Deskew bằng Hough Lines)
[2.4] Thử 4 biến thể tiền xử lý (CLAHE, Grayscale, Binary, Inverted)
→ tự động chọn kết quả tốt nhất
[2.5] Tự động scale up vùng biển số nhỏ (< 60px) trước OCR
[2.6] Hỗ trợ đọc file ảnh có tên tiếng Việt/ký tự đặc biệt
[2.7] Resize ảnh đầu vào về tối đa 1280px (tránh tốn RAM)
─────────────────────────────────────────────────
3. PHÁT HIỆN VÙNG BIỂN SỐ
─────────────────────────────────────────────────
[3.1] Phát hiện bằng OpenCV Contour Analysis (không cần GPU)
[3.2] Dùng đồng thời Otsu + Adaptive Threshold để bắt nhiều trường hợp
[3.3] Lọc vùng theo aspect ratio: 1 dòng (2.3–6.5), 2 dòng (0.75–2.0)
[3.4] Chấm điểm vùng theo aspect ratio × diện tích (tránh noise nhỏ)
[3.5] Khử vùng trùng lặp bằng IoU (Non-Maximum Suppression)
[3.6] Kiến trúc mở: hỗ trợ tích hợp model YOLO fine-tune trong tương lai
─────────────────────────────────────────────────
4. HẬU XỬ LÝ CHUỖI BIỂN SỐ
─────────────────────────────────────────────────
[4.1] Chuẩn hóa định dạng biển VN: XX[A-Z][0-9]-NNNNN
[4.2] Sửa lỗi OCR: dấu chấm → gạch ngang ("18A.12345" → "18A-12345")
[4.3] Sửa lỗi OCR: "4" bị đọc thành "L" ("18AL083" → "18A-41083")
[4.4] Sửa lỗi OCR: chữ cái ở vị trí số ("1BA" → "18A")
[4.5] Sửa lỗi OCR: số ở vị trí chữ cái ("541" → "54L" hoặc "54I")
[4.6] Cắt bỏ ký tự số thừa cuối ("18A-123457" → "18A-12345")
[4.7] Ghép 2 dòng OCR thành biển số hoàn chỉnh (biển 2 dòng xe máy)
[4.8] Fallback OCR toàn ảnh nếu không tìm được vùng biển số
─────────────────────────────────────────────────
5. GIAO DIỆN NGƯỜI DÙNG
─────────────────────────────────────────────────
[5.1] Giao diện Dark Theme (Catppuccin Mocha)
[5.2] Bố cục chia đôi: ảnh trái, lịch sử phải (QSplitter)
[5.3] Hiển thị biển số lớn + màu nổi bật sau mỗi lần nhận diện
[5.4] Thanh tiến trình (Progress Bar) khi đang xử lý
[5.5] Thanh trạng thái (Status Bar) thông báo từng bước
[5.6] Xử lý AI trong luồng nền (QThread) — giao diện không bị đóng băng
[5.7] Tự động nạp model khi khởi động (không block UI)
─────────────────────────────────────────────────
6. LỊCH SỬ & CƠ SỞ DỮ LIỆU
─────────────────────────────────────────────────
[6.1] Lưu tự động kết quả vào SQLite sau mỗi lần nhận diện
[6.2] Bảng lịch sử hiển thị: STT, Biển số, Độ tự tin, Tên file, Thời gian
[6.3] Tìm kiếm/lọc lịch sử theo biển số (real-time khi gõ)
[6.4] Xóa một bản ghi hoặc xóa toàn bộ lịch sử (có xác nhận)
[6.5] Lưu trữ cục bộ (file bien_so_xe.db) — không cần server
─────────────────────────────────────────────────
7. XUẤT DỮ LIỆU
─────────────────────────────────────────────────
[7.1] Xuất toàn bộ lịch sử ra file Excel (.xlsx)
[7.2] File Excel có header màu, tự động căn chỉnh độ rộng cột
[7.3] Nội dung xuất: ID, Biển số, Độ tự tin (%), Đường dẫn ảnh, Thời gian
─────────────────────────────────────────────────
8. KỸ THUẬT & HIỆU NĂNG
─────────────────────────────────────────────────
[8.1] Chạy hoàn toàn trên CPU — không yêu cầu GPU
[8.2] Thời gian xử lý: 5–15 giây/ảnh (CPU, 4 biến thể × tối đa 15 vùng)
[8.3] Tự động tải model EasyOCR lần đầu (~200 MB), cache cho các lần sau
[8.4] Hỗ trợ Python 3.10–3.13
[8.5] Quản lý môi trường bằng uv (không cần cài pip/venv thủ công)
─────────────────────────────────────────────────
9. CHƯA HỖ TRỢ / HẠN CHẾ
─────────────────────────────────────────────────
[9.1] Chưa xử lý video hoặc camera thời gian thực
[9.2] Chưa có model YOLO fine-tune cho biển số VN
(đang dùng Contour Analysis thay thế)
[9.3] Độ chính xác giảm khi biển số < 60px chiều cao trong ảnh
[9.4] Chưa hỗ trợ biển quân đội, ngoại giao, xe công nghệ
[9.5] Chưa kiểm thử trên macOS / Linux
[9.6] Tốc độ chậm khi xử lý ảnh có nhiều vùng phức tạp (>15 ứng viên)
====================================================
Tổng: 8 nhóm chức năng | 52 tính năng chi tiết
====================================================
XEM THÊM ==> Hướng dẫn cài đặt chi tiết
HƯỚNG DẪN CÀI ĐẶT
# Hướng Dẫn Cài Đặt & Chạy Ứng Dụng
Ứng dụng nhận diện biển số xe Việt Nam (ANPR) chạy trên **Windows 10/11**, không cần GPU.
---
## Yêu cầu hệ thống
- Windows 10 / 11 (64-bit)
- RAM: tối thiểu 4 GB (khuyến nghị 8 GB)
- Dung lượng ổ cứng: ~3 GB (cho model EasyOCR lần đầu tải về)
- Kết nối internet lần đầu cài đặt
---
## Bước 1 — Cài đặt uv
**uv** là công cụ quản lý Python & thư viện, thay thế cho pip/venv.
Mở **PowerShell** (không cần quyền Admin) và chạy:
```powershell
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
```
Sau khi cài xong, **đóng và mở lại PowerShell**, rồi kiểm tra:
```powershell
uv --version
```
Kết quả mong đợi: `uv 0.x.x (...)` — nếu thấy version là cài thành công.
---
## Bước 2 — Tải source code
Nếu đã cài **Git**:
```powershell
git clone https://github.com/<ten-tai-khoan>/<ten-repo>.git
cd <ten-repo>
```
Nếu chưa có Git, tải file ZIP trên GitHub → **Code → Download ZIP** → giải nén → mở thư mục vừa giải nén.
---
## Bước 3 — Cài thư viện
Trong thư mục dự án, chạy:
```powershell
uv sync
```
Lệnh này tự động:
- Tải Python phiên bản phù hợp (nếu máy chưa có)
- Tạo môi trường ảo `.venv/`
- Cài tất cả thư viện trong `pyproject.toml`
> Lần đầu có thể mất **3–10 phút** tuỳ tốc độ mạng.
---
## Bước 4 — Chạy ứng dụng
```powershell
uv run main.py
```
**Lần đầu chạy**, ứng dụng sẽ tự tải model EasyOCR (~200 MB) về thư mục `C:\Users\<ten>\\.EasyOCR\` — chỉ tải một lần duy nhất.
---
## Cách sử dụng
1. Kéo thả file ảnh (JPG, PNG, BMP, WEBP) vào vùng hiển thị
**hoặc** nhấn nút **Mở Ảnh** để chọn file.
2. Đợi thanh tiến trình hoàn tất (~5–15 giây/ảnh trên CPU).
3. Biển số và độ tự tin hiển thị ngay dưới ảnh.
4. Lịch sử nhận diện lưu tự động vào bảng bên phải.
5. Dùng ô **Tìm kiếm** để lọc theo biển số.
6. Nhấn **Export Excel** để xuất lịch sử ra file `.xlsx`.
### Xử lý nhiều ảnh cùng lúc (Batch)
Nhấn **Batch (Nhiều ảnh)** → chọn nhiều file → ứng dụng xử lý tuần tự và lưu tất cả kết quả.
---
## Khắc phục lỗi thường gặp
| Lỗi | Nguyên nhân | Cách xử lý |
|-----|-------------|------------|
| `uv: command not found` | Chưa cài uv hoặc chưa restart PowerShell | Đóng/mở lại PowerShell sau khi cài |
| `uv sync` báo lỗi mạng | Kết nối internet yếu/chậm | Thử lại, hoặc dùng mạng khác |
| Cửa sổ ứng dụng không hiện | Lỗi thiếu thư viện PySide6 | Chạy lại `uv sync` |
| Lần đầu chạy rất chậm | Đang tải model EasyOCR | Đợi, chỉ xảy ra lần đầu |
| Không nhận diện được biển số | Ảnh quá nhỏ hoặc mờ | Dùng ảnh ≥ 800×600px, biển số rõ nét |
---
## Cấu trúc thư mục
```
├── main.py # Chạy ứng dụng
├── pyproject.toml # Danh sách thư viện
├── ui/ # Giao diện
├── core/ # Engine AI
├── database/ # Cơ sở dữ liệu SQLite
└── data/ # Thư mục chứa ảnh mẫu (tuỳ chọn)
```
---
## Yêu cầu ảnh đầu vào để đạt kết quả tốt
- Độ phân giải: **tối thiểu 800×600px**, khuyến nghị 1920×1080px
- Biển số chiếm ít nhất **5% diện tích ảnh**
- Góc nghiêng: dưới **25°**
- Ánh sáng: tránh ngược sáng, tránh tối hoàn toàn
Nguồn: Topcode.vn