- Bước 1: Mở video cần mô phỏng, mở phần mềm Matlab và mở phần mềm Pycharm
- Bước 2: Khởi chạy chương trình Pycharm
- Bước 3: Hệ thống sẽ hiện ra quá trình các cầu thủ thi đấu với hai khung màu theo dõi riêng biệt của mỗi đội
- Bước 4: Hệ thống sẽ tự kết thúc nếu chạy xong quá trình theo dõi hoặc có thể kết thúc ngay lúc nhấn chữ P
- Bước 5: Khởi chạy chương trình Matlab
- Bước 6: Hệ thống sẽ cho thấy quá trình cầu thủ hai đội đang di chuyển và hiện qua một mặt phẳng 2D mô phỏng lại mặt sân bóng rổ thực tế
- Bước 7: Hệ thống sẽ kết thúc khi chạy xong chương trình
4.2 Kết quả thực nghiệm 4.2.1 Kết quả trên Python
- Nhận diện được cầu thủ trong video đã chọn trước đó qua các khung hình
- Theo dõi cầu thủ bằng các khung đã quy ước trước đó
Hình 4-2. Theo dõi cầu thủ bằng các khung hình 4.2.2 Kết quả trên Matlab
- Sự chuyển động của các chấm tròn trên mặt phẳng 2D mô phỏng lại sân đấu bóng rổ.
Hình 4-3. Vị trí cầu thủ trên sân bóng rổ theo mô phỏng 2D
5.1 Kết luận
- Hệ thống cơ bản đã đáp ứng được yêu cầu mà đề tài đặt ra. - Ưu điểm:
+ Lập trình dựa trên ngôn ngữ đã học là C trong phần mềm Python và Matlab. + Hệ thống còn đơn giản và có thể áp dụng cho những tình huống không quá phức tạp.
+ Có thể áp dụng kiến thức đã học trong môn xử lý ảnh số để xử lý một vài yêu cầu của đề tài này.
- Nhược điểm:
+ Hệ thống vẫn chưa hoàn thiện hết những yêu cầu đề tài đã đề ra. + Còn sai sót trong quá trình theo dõi cầu thủ.
+ Độ trễ của các khung hình hơi cao.
5.2 Hướng phát triển
- Hệ thống có thể nâng cấp lên để có thể nhận diện nhiều người hơn
- Có thể áp dụng hệ thống cho các bộ môn thể thao khác như bóng đá, bóng chuyền, bóng ném...
- Hệ thống sẽ cần phát triển khả năng nhận diện và tăng độ chính xác khi theo dõi từ đó có thể áp dụng theo dõi nhiều khía cạnh của cuộc sống hơn như là theo dõi phương tiện giao thông, quản lý hành khách ở sân bay,...
Tiếng Việt https://topdev.vn/blog/opencv-la-gi-hoc-computer-vision-khong-kho/ https://www.codehub.com.vn/Python-Co-Ban Tiếng Anh https://www.pyimagesearch.com/2018/08/06/tracking-multiple-objects-with- opencv/ https://github.com/davheld/GOTURN PHỤ LỤC 1: Chương Trình Python import cv2
TrDict = { "csrt": cv2.legacy.TrackerCSRT_create, "kcf": cv2.legacy.TrackerKCF_create, } trackers = cv2.legacy.MultiTracker_create() v = cv2.VideoCapture(r'C:\Users\APC\Desktop\game.avi') ret, frame = v.read()
k = 10
for i in range(k):
cv2.imshow('Frame', frame)
bbi = cv2.selectROI('Frame', frame) tracker_i = TrDict['csrt']()
trackers.add(tracker_i, frame, bbi) while True:
ret, frame = v.read() if not ret:
break
(success, boxes) = trackers.update(frame) for box in boxes:
(x, y, w, h) = [int(a) for a in box]
cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 255), 2) cv2.imshow('Frame', frame)
key = cv2.waitKey(5) & 0xFF if key == ord('q'): break v.release() cv2.destroyAllWindows() PHỤ LỤC 2: Chương trình Matlab global vidObj
video = 'game.avi'; % Basketball game video vidObj = VideoReader(video);
TRACK = []; TRAIN = train(); for i = 1:vidObj.NumberOfFrames POS = playerDetection(TRAIN,f,courtMask); TRACK = playerTracking(POS,TRACK);
[TRACK , topDown{i}] = playerHomography(TRACK); end topDown = imread('court.png'); colors = {'blue','black','yellow','magenta','cyan','blue','black','yellow','magenta','cyan'}; for t = 1:5 for i = 1:length(TRACK(1,t).xH) if i == 1
topDown = insertShape(topDown, 'FilledCircle',[TRACK(1,t).xH(i)... TRACK(1,t).yH(i) 6],'Color','green','Opacity',1);
elseif i == length(TRACK(1,t).xH)
topDown = insertShape(topDown, 'FilledCircle',[TRACK(1,t).xH(i)... TRACK(1,t).yH(i) 6],'Color','red','Opacity',1);
else
topDown = insertShape(topDown, 'FilledCircle',[TRACK(1,t).xH(i)... TRACK(1,t).yH(i) 2],'Color',colors{t},'Opacity',1); end end end figure;imshow(topDown); topDown = imread('court.png');
for t = 6:10
for i = 1:length(TRACK(1,t).xH) if i == 1
topDown = insertShape(topDown, 'FilledCircle',[TRACK(1,t).xH(i)... TRACK(1,t).yH(i) 6],'Color','green','Opacity',1);
elseif i == length(TRACK(1,t).xH)
topDown = insertShape(topDown, 'FilledCircle',[TRACK(1,t).xH(i)... TRACK(1,t).yH(i) 6],'Color','red','Opacity',1);
else
topDown = insertShape(topDown, 'FilledCircle',[TRACK(1,t).xH(i)... TRACK(1,t).yH(i) 2],'Color',colors{t},'Opacity',1); end end end figure;imshow(topDown); writer = VideoWriter('track.avi'); writer.FrameRate = 25; open(writer); for i = 1:length(TRACK(1,1).xH) topDown = imread('court.png'); for ip = 1:5
topDown = insertShape(topDown, 'FilledCircle',[TRACK(1,ip).xH(i)... TRACK(1,ip).yH(i) 6],'Color','red','Opacity',1);
end
for ip = 6:10
topDown = insertShape(topDown, 'FilledCircle',[TRACK(1,ip).xH(i)... TRACK(1,ip).yH(i) 6],'Color','blue','Opacity',1);
end
writeVideo(writer, frames(i)); end
close(writer); implay((frames));