You are on page 1of 10

HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG

KHOA KĨ THUẬT ĐIỆN TỬ 1


=====o0o=====

BÁO CÁO CHUYÊN ĐỀ

ĐỀ TÀI:

CHƯƠNG TRÌNH PHÁT HIỆN ĐỐI


TƯỢNG CHUYỂN DỘNG

Giảng viên hướng dẫn : Bùi Thị Dân


Môn học : Chuyên đề xử lý tín hiệu và truyền thông
Nhóm môn học : 02
Nhóm chuyên đề : 18
Sinh viên thực hiện : Phạm Phú Phúc B18DCDT187
Trần Long Thành B18DCDT236

HÀ NỘI, 03 / 2022

---⁃⁃⁃⁃‹‹‹﴾֍﴿›››⁃⁃⁃⁃---
MỤC LỤC

A. MÔ TẢ ĐỀ TÀI 3

I. Chuẩn bị 3

II. Sơ lược về đề tài 3

B. BÁO CÁO CHI TIẾT ĐỀ TÀI 3

I. Tổng quan về đề tài 3

1. Khái niệm Object Tracking 3

2. Phân loại 3

II. Quá trình thực hiện 4

1. Phát hiện đối tượng và xác định khu vực xem xét 4

2. Vẽ hộp xung quanh đối tượng 5

3. Theo dõi đối tượng 5

4. Liên kết ID duy nhất với đối tượng 6

III. Chạy demo chương trình 6

IV. Source code 7


CHƯƠNG TRÌNH THEO DÕI ĐỐI TƯỢNG
CHUYỂN DỘNG
A. MÔ TẢ ĐỀ TÀI
I. Chuẩn bị
• Sử dụng Python, thư viện OpenCV và phần mềm Pycharm
• 1 video đoạn đường cao tốc mà nhóm sử dụng để đếm các phương tiện
II. Sơ lược về đề tài
Bước 1: Tổng quan về đề tài: Nêu sơ lược về Object tracking
Bước 2: Thực hiện chương trình:
• Phát hiện đối tượng và xác định khu vực xem xét: Chương trình sẽ phát
hiện các đối tượng là các loại phương tiện đang di chuyển và xác định khu
vực nhỏ trên video để có thể xác định và đếm số phương tiện đi qua khu
vực đó.
• Vẽ hộp xung quanh đối tượng: Xác định các đối tượng đi qua khu vực xem
xét.
• Theo dõi đối tượng: Theo dõi các đối tượng có hình hộp bao quanh để thực
hiện đếm số đối tượng đi qua khu vực xem xét.
• Liên kết ID với đối tượng: Hiển thị số thứ tự của đối tượng di chuyển qua
khu vực xem xét.
Bước 3: Kết quả dự kiến: Chương trình sẽ đếm số phương tiện đi qua một khu
vực nhất định.

B. BÁO CÁO CHI TIẾT ĐỀ TÀI


I. Tổng quan về đề tài
1. Khái niệm Object Tracking
Theo dõi đối tượng chuyển động (Object Tracking) là bài toán cho phép ta định
vị đối tượng chuyển động theo thời gian bằng camera.

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.

2. Vẽ hộp xung quanh đối tượng


Trước khi tiếp tục với hình chữ nhật, ta làm sạch thêm hình ảnh. Để làm điều
này, ta sử dụng chức năng ngưỡng. Bắt đầu từ mặt nạ, để chỉ hiển thị các giá trị
trắng hoặc đen thì bằng cách viết “254, 255” chỉ các giá trị từ 254 đến 255 sẽ
được xem xét.

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.

3. Theo dõi đối tượng


Ta nhập và tích hợp các chức năng theo dõi

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ể.

4. Liên kết ID duy nhất với đối tượng


Cuối cùng ta chuyển mảng với các vị trí cho tracker.update ().Ta sẽ nhận được
một mảng với các potions nhưng ngoài ra, một id duy nhất sẽ được chỉ định cho
mỗi đối tượng.

III. Chạy demo chương trình


IV. Source code
- Mã chương trình chính xuất video, xác định đối tượng (file: main.py)
import cv2
from tracker import *

# Create tracker object


tracker = EuclideanDistTracker()

cap = cv2.VideoCapture("highway.mp4")

# Object detection from Stable camera


object_detector = cv2.createBackgroundSubtractorMOG2(history=100, varThreshold=40)

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

def update(self, objects_rect):


# Objects boxes and ids
objects_bbs_ids = []

# Get center point of new object


for rect in objects_rect:
x, y, w, h = rect
cx = (x + x + w) // 2
cy = (y + y + h) // 2

# Find out if that object was detected already


same_object_detected = False
for id, pt in self.center_points.items():
dist = math.hypot(cx - pt[0], cy - pt[1])

if dist < 25:


self.center_points[id] = (cx, cy)
print(self.center_points)
objects_bbs_ids.append([x, y, w, h, id])
same_object_detected = True
break

# New object is detected we assign the ID to that object


if same_object_detected is False:
self.center_points[self.id_count] = (cx, cy)
objects_bbs_ids.append([x, y, w, h, self.id_count])
self.id_count += 1

# 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

# Update dictionary with IDs not used removed


self.center_points = new_center_points.copy()
return objects_bbs_ids

You might also like