Untitled
unknown
python
3 years ago
5.1 kB
6
Indexable
import time
import numpy as np
import cv2
#Video capture
cap = cv2.VideoCapture(r'D:\University\Fontys\Year4\Minor\Vision\Level 2\Lv2_Ass10 - People counter\video.mp4')
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
video = cv2.VideoWriter(r'E:/6.avi', fourcc, 25, size)
#Filtering
#fgbg = cv2.createBackgroundSubtractorMOG2() # background sub option 1
fgbg = cv2.createBackgroundSubtractorKNN() # background sub option 2
#Global variables
current_people_detected = 0
prev_people_detected = 0
total_people_detected = 0
start_detected_timer = 0
stop_detected_timer = 0
while(1):
ret, frame = cap.read()
if not ret:
break
# single frame from video
frame = cv2.convertScaleAbs(frame)
# grayscale conversion
imgray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
# frame with background subtraction
fgmask = fgbg.apply(imgray)
# apply gaussian blur
blur_video = cv2.GaussianBlur(fgmask, (9, 9), 0)
# apply bilateral blur
bilateral_video = cv2.bilateralFilter(blur_video,20,200,300)
# detect blobs (people)
params = cv2.SimpleBlobDetector_Params()
''' Set parameters of blob detection'''
params.minThreshold = 0
params.maxThreshold = 255
params.filterByArea = True
params.minArea = 2500
params.maxArea = 5000
params.filterByCircularity = True
params.minCircularity = 0.1
params.maxCircularity = 1
params.filterByConvexity = True
params.minConvexity = 0.1
params.maxConvexity = 1
params.filterByInertia = True
params.minInertiaRatio = 0.2
params.maxInertiaRatio = 1
params.filterByColor = True
params.blobColor = 255 # 0 = black / 255 = white
params.minDistBetweenBlobs = 50
''' End of parameter settings'''
ver = (cv2.__version__).split('.')
if int(ver[0]) < 3:
detector = cv2.SimpleBlobDetector(params) # Create a detector with the parameters
else:
detector = cv2.SimpleBlobDetector_create(params) # Create a detector with the parameters
# Detect the blobs on the filtered video
keypoints_bg = detector.detect(blur_video)
# Draw blobs with apropriate size on the filtered video
im_with_keypoints_bg = cv2.drawKeypoints(blur_video, keypoints_bg, np.array([]), (0,0, 255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
# Draw blobs with apropriate size on the normal video
im_with_keypoints_normal = cv2.drawKeypoints(frame, keypoints_bg, np.array([]), (0,0, 255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
''' People Counter'''
current_people_detected = len(keypoints_bg) # The current people on screen are the current blobs detected
if current_people_detected < prev_people_detected: # if there's less blobs now than before 'start' timer
start_detected_timer = time.time()
if current_people_detected > prev_people_detected: # if there's more blobs now than before 'stop' timer
stop_detected_timer = time.time()
time_detected_person = stop_detected_timer - start_detected_timer # calculate the time between blob detections
# threshold by testing; if too low to many flickers are detected; if too high clumps of people are not detected
# what worked during testing is anywhere from 0.2 to 0.35
# video presented was shot on 0.25; 0.3 gives less faulty positives but has trouble on clumps of people
if time_detected_person < 0.25:
total_people_detected = total_people_detected
else:
total_people_detected = total_people_detected + current_people_detected - prev_people_detected
prev_people_detected = current_people_detected
''' End of People Counter'''
if ret == True:
# Text for current people detected
text_current_people = "People on Screen: " + str(len(keypoints_bg))
cv2.putText(im_with_keypoints_bg, text_current_people, (10, 275),cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 1)
# Text for total number of people detected
text_total_people = "Total People: " + str(total_people_detected)
cv2.putText(im_with_keypoints_bg, text_total_people, (230, 275),cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 1)
# Display filtered video clip with blobs
video.write(im_with_keypoints_bg)
cv2.imshow('People Counter - Filtered View', im_with_keypoints_bg)
# Text for current people detected
cv2.putText(im_with_keypoints_normal, text_current_people, (10, 275),cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 1)
# Text for total number of people detected
cv2.putText(im_with_keypoints_normal, text_total_people, (230, 275),cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 1)
# Display normal clip with blobs
cv2.imshow('People Counter - Normal View',im_with_keypoints_normal)
else:
cap.release()
break
k = cv2.waitKey(10) & 0xff
if k == 27:
breakEditor is loading...