import cv2
import numpy as np
from tracker import *
# Create tracker object
tracker = EuclideanDistTracker()
cap = cv2.VideoCapture("Video Source")
count = 0
while True:
ret, frame = cap.read()
print("\n")
if(count != 0):
print("Frame Count: ", count)
frame = cv2.resize(frame, (0, 0), fx = 1.5, fy = 1.5)
height, width, channels = frame.shape
# 1. Object Detection
hsvFrame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
sensitivity = 20
white_lower = np.array([0,0,255-sensitivity])
white_upper = np.array([255,sensitivity,255])
white_mask = cv2.inRange(hsvFrame, white_lower, white_upper)
# Morphological Transform, Dilation
kernal = np.ones((3, 3), "uint8")
c = 1
contours_w, hierarchy_w = cv2.findContours(white_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
detections = []
for contour_w in contours_w:
area = cv2.contourArea(contour_w)
if area > 200 and area < 100000:
cv2.drawContours(frame, [contour_w], -1, (0, 0, 0), 1)
x,y,w,h = cv2.boundingRect(contour_w)
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(frame, str(id), (x - 8, y + 8), cv2.FONT_HERSHEY_PLAIN, 2, (0, 0, 0), 2)
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 0), 1)
cv2.imshow("Frame", frame)
count += 1
key = cv2.waitKey(0)
if key == 27:
break
cap.release()
cv2.destroyAllWindows()
aW1wb3J0IGN2MgppbXBvcnQgbnVtcHkgYXMgbnAKZnJvbSB0cmFja2VyIGltcG9ydCAqCgojIENyZWF0ZSB0cmFja2VyIG9iamVjdAp0cmFja2VyID0gRXVjbGlkZWFuRGlzdFRyYWNrZXIoKQoKY2FwID0gY3YyLlZpZGVvQ2FwdHVyZSgiVmlkZW8gU291cmNlIikKCmNvdW50ID0gMAoKd2hpbGUgVHJ1ZToKICAgIHJldCwgZnJhbWUgPSBjYXAucmVhZCgpCgogICAgcHJpbnQoIlxuIikKICAgIAogICAgaWYoY291bnQgIT0gMCk6CiAgICAgICAgcHJpbnQoIkZyYW1lIENvdW50OiAiLCBjb3VudCkKICAgIGZyYW1lID0gY3YyLnJlc2l6ZShmcmFtZSwgKDAsIDApLCBmeCA9IDEuNSwgZnkgPSAxLjUpCiAgICBoZWlnaHQsIHdpZHRoLCBjaGFubmVscyA9IGZyYW1lLnNoYXBlCiAKICAgICMgMS4gT2JqZWN0IERldGVjdGlvbgogICAgaHN2RnJhbWUgPSBjdjIuY3Z0Q29sb3IoZnJhbWUsIGN2Mi5DT0xPUl9CR1IySFNWKQogICAgc2Vuc2l0aXZpdHkgPSAyMAogICAgd2hpdGVfbG93ZXIgPSBucC5hcnJheShbMCwwLDI1NS1zZW5zaXRpdml0eV0pCiAgICB3aGl0ZV91cHBlciA9IG5wLmFycmF5KFsyNTUsc2Vuc2l0aXZpdHksMjU1XSkKICAgIHdoaXRlX21hc2sgPSBjdjIuaW5SYW5nZShoc3ZGcmFtZSwgd2hpdGVfbG93ZXIsIHdoaXRlX3VwcGVyKQoKICAgICMgTW9ycGhvbG9naWNhbCBUcmFuc2Zvcm0sIERpbGF0aW9uCiAgICBrZXJuYWwgPSBucC5vbmVzKCgzLCAzKSwgInVpbnQ4IikKICAgIGMgPSAxCgogICAgY29udG91cnNfdywgaGllcmFyY2h5X3cgPSBjdjIuZmluZENvbnRvdXJzKHdoaXRlX21hc2ssIGN2Mi5SRVRSX1RSRUUsIGN2Mi5DSEFJTl9BUFBST1hfTk9ORSkKICAgIGRldGVjdGlvbnMgPSBbXSAKCiAgICBmb3IgY29udG91cl93IGluIGNvbnRvdXJzX3c6CiAgICAgICAgYXJlYSA9IGN2Mi5jb250b3VyQXJlYShjb250b3VyX3cpCiAgICAgICAgaWYgYXJlYSA+IDIwMCBhbmQgYXJlYSA8IDEwMDAwMDoKICAgICAgICAgICAgY3YyLmRyYXdDb250b3VycyhmcmFtZSwgW2NvbnRvdXJfd10sIC0xLCAoMCwgMCwgMCksIDEpCiAgICAgICAgICAgIHgseSx3LGggPSBjdjIuYm91bmRpbmdSZWN0KGNvbnRvdXJfdykKICAgICAgICAgICAgZGV0ZWN0aW9ucy5hcHBlbmQoW3gsIHksIHcsIGhdKQoKICAgICMgMi4gT2JqZWN0IFRyYWNraW5nCiAgICBib3hlc19pZHMgPSB0cmFja2VyLnVwZGF0ZShkZXRlY3Rpb25zKQogICAgZm9yIGJveF9pZCBpbiBib3hlc19pZHM6CiAgICAgICAgeCwgeSwgdywgaCwgaWQgPSBib3hfaWQKICAgICAgICBjdjIucHV0VGV4dChmcmFtZSwgc3RyKGlkKSwgKHggLSA4LCB5ICsgOCksIGN2Mi5GT05UX0hFUlNIRVlfUExBSU4sIDIsICgwLCAwLCAwKSwgMikKICAgICAgICBjdjIucmVjdGFuZ2xlKGZyYW1lLCAoeCwgeSksICh4ICsgdywgeSArIGgpLCAoMCwgMCwgMCksIDEpCgogICAgY3YyLmltc2hvdygiRnJhbWUiLCBmcmFtZSkgCiAgICBjb3VudCArPSAxCiAgICBrZXkgPSBjdjIud2FpdEtleSgwKQogICAgaWYga2V5ID09IDI3OgogICAgICAgIGJyZWFrCgpjYXAucmVsZWFzZSgpCmN2Mi5kZXN0cm95QWxsV2luZG93cygp