Professional Documents
Culture Documents
ĐỀ TÀI:
HÀ NỘI, 03 / 2022
---⁃⁃⁃⁃‹‹‹﴾֍﴿›››⁃⁃⁃⁃---
MỤC LỤC
A. MÔ TẢ ĐỀ TÀI 3
I. Chuẩn bị 3
2. Phân loại 3
1. Phát hiện đối tượng và xác định khu vực xem xét 4
2. Phân loại
Object Tracking có thể chia thành 2 cách tiếp cận chính:
Single Object Tracking (SOT): Single Object Tracking tập trung vào việc
theo dõi một đối tượng duy nhất trong toàn bộ video.
Mutiple Object Tracking (MOT): Mutliple Object Tracking hướng tới các
ứng dụng có tính mở rộng cao hơn. Bài toán cố gắng phát hiện đồng thời
theo dõi tất cả các đối tượng trong tầm nhìn, kể cả các đối tượng mới xuất
hiện trong video.
II. Quá trình thực hiện
1. Phát hiện đối tượng và xác định khu vực xem xét
Hàm “cv2.createBackgroundSubtractorMOG2” được sử dụng đề trả về tham số
“tỷ lệ nền” của thuật toán và sau đó tạo mặt nạ, đông thời xác định khu vực xem
xét và chỉ áp dụng mặt nạ trong khu vực này.
Do có rất nhiều nhiễu trong hình ảnh, nên ta cải thiện việc trích xuất bằng cách
loại bỏ tất cả các phần tử nhỏ hơn và tập trung sự chú ý vào các đối tượng lớn
hơn một khu vực nhất định. Do vậy ta mới xác định khu vực xem xét nhất định
và chỉ áp dụng mặt nạ trong khu vực đó.
Sau đó ta bổ sung các tham số cho hàm cv2.createBackgroundSubtractorMOG2,
History là tham số đầu tiên, trong trường hợp này, nó được đặt thành 100 vì máy
ảnh được cố định, và Threshold thay vào đó là 40 vì giá trị càng thấp thì khả
năng xác định sai càng cao. Trong trường hợp này, ta chỉ quan tâm đến các đối
tượng lớn hơn.
Sau đó, ta chèn tọa độ của đối tượng tìm thấy vào điều kiện if và vẽ hình chữ
nhật.
Khi đối tượng đã được tạo, do đó ta phải lấy từng vị trí của hộp giới hạn và chèn
chúng vào một mảng duy nhất.
Bằng cách hiển thị kết quả trên màn hình, ta có thể thấy tất cả các làn đi qua khu
vực xem xét được xác định như thế nào và vị trí của chúng được chèn vào một
mảng cụ thể.
cap = cv2.VideoCapture("highway.mp4")
while True:
ret, frame = cap.read()
height, width, _ = frame.shape
# Extract Region of interest
roi = frame[340: 720,500: 800]
# 1. Object Detection
mask = object_detector.apply(roi)
_, mask = cv2.threshold(mask, 254, 255, cv2.THRESH_BINARY)
contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
detections = []
for cnt in contours:
# Calculate area and remove small elements
area = cv2.contourArea(cnt)
if area > 100:
#cv2.drawContours(roi, [cnt], -1, (0, 255, 0), 2)
x, y, w, h = cv2.boundingRect(cnt)
detections.append([x, y, w, h])
# 2. Object Tracking
boxes_ids = tracker.update(detections)
for box_id in boxes_ids:
x, y, w, h, id = box_id
cv2.putText(roi, str(id), (x, y - 15), cv2.FONT_HERSHEY_PLAIN, 2, (255, 0, 0), 2)
cv2.rectangle(roi, (x, y), (x + w, y + h), (0, 255, 0), 3)
cv2.imshow("roi", roi)
cv2.imshow("Frame", frame)
cv2.imshow("Mask", mask)
key = cv2.waitKey(30)
if key == 27:
break
cap.release()
cv2.destroyAllWindows()
- Mã chương trình theo dõi và đếm số đối tượng (file: tracker.py)
import math
class EuclideanDistTracker:
def __init__(self):
# Store the center positions of the objects
self.center_points = {}
# Keep the count of the IDs
# each time a new object id detected, the count will increase by one
self.id_count = 0
# Clean the dictionary by center points to remove IDS not used anymore
new_center_points = {}
for obj_bb_id in objects_bbs_ids:
_, _, _, _, object_id = obj_bb_id
center = self.center_points[object_id]
new_center_points[object_id] = center