import cv2
import numpy as np
from tracker import *
import cvzone
import timebg_subtractor = cv2.createBackgroundSubtractorMOG2(history=200, varThreshold=140)#Open a video capture
video_capture = cv2.VideoCapture(r"store.mp4")def RGB(event, x, y, flags, param):if event == cv2.EVENT_MOUSEMOVE:point =[x, y]print(point)cv2.namedWindow('RGB')
cv2.setMouseCallback('RGB', RGB)
tracker =Tracker()area1 =[(213,165),(200,189),(693,373),(697,341)]
area2 =[(195,199),(186,213),(683,404),(689,388)]
er ={}
counter1 =[]
ex ={}
counter2 =[]while True:ret, frame = video_capture.read()if not ret:breakframe = cv2.resize(frame,(1028,500))mask = bg_subtractor.apply(frame)_, mask = cv2.threshold(mask,245,255, cv2.THRESH_BINARY)contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)list =[]for cnt in contours:area = cv2.contourArea(cnt)if area >1500:#cv2.drawContours(frame,[cnt],-1,(0,255,0),2)x, y, w, h = cv2.boundingRect(cnt)list.append([x, y, w, h])bbox_idx = tracker.update(list)for bbox in bbox_idx:x1, y1, x2, y2, id = bboxcx =int(x1 + x1 + x2)// 2cy =int(y1 + y1 + y2)// 2result = cv2.pointPolygonTest(np.array(area1, np.int32),((cx, cy)), False)if result >=0:er[id]=(cx, cy)if id in er:result1 = cv2.pointPolygonTest(np.array(area2, np.int32),((cx, cy)), False)if result1 >=0:cv2.rectangle(frame,(x1, y1),(x2 + x1, y2 + y1),(0,255,0),3)cvzone.putTextRect(frame, f'{id}',(cx, cy),2,2)cv2.circle(frame,(cx, cy),5,(0,255,0),-1)if counter1.count(id)==0:counter1.append(id)result2 = cv2.pointPolygonTest(np.array(area2, np.int32),((cx, cy)), False)if result2 >=0:ex[id]=(cx, cy)if id in ex:result3 = cv2.pointPolygonTest(np.array(area1, np.int32),((cx, cy)), False)if result3 >=0:cv2.rectangle(frame,(x1, y1),(x2 + x1, y2 + y1),(0,0,255),3)cvzone.putTextRect(frame, f'{id}',(cx, cy),2,2)cv2.circle(frame,(cx, cy),5,(0,255,0),-1)if counter2.count(id)==0:counter2.append(id)cv2.polylines(frame,[np.array(area1, np.int32)], True,(0,0,255),2)cv2.polylines(frame,[np.array(area2, np.int32)], True,(0,0,255),2)Enter =len(counter1)Exit =len(counter2)cvzone.putTextRect(frame, f'ENTER:-{Enter}',(50,60),2,2)cvzone.putTextRect(frame, f'EXIT:-{Exit}',(50,130),2,2)cv2.imshow('RGB', frame)time.sleep(0.01)if cv2.waitKey(1)&0xFF==27: # Press 'Esc' to exitbreak#Release the video capture and close windows
video_capture.release()
cv2.destroyAllWindows()
import mathclass Tracker:def __init__(self):#Store the center positions of the objectsself.center_points ={}#Keep the count of the IDs#eachtime a new object id detected, the count will increase by oneself.id_count =0def update(self, objects_rect):#Objects boxes and idsobjects_bbs_ids =[]#Get center point of new objectfor rect in objects_rect:x, y, w, h = rectcx =(x + x + w)// 2cy =(y + y + h)// 2#Find out if that object was detected alreadysame_object_detected = Falsefor id, pt in self.center_points.items():dist = math.hypot(cx - pt[0], cy - pt[1])if dist <35:self.center_points[id]=(cx, cy)#print(self.center_points)objects_bbs_ids.append([x, y, w, h, id])same_object_detected = Truebreak#New object is detected we assign the ID to that objectif 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 anymorenew_center_points ={}for obj_bb_id in objects_bbs_ids:_, _, _, _, object_id = obj_bb_idcenter = self.center_points[object_id]new_center_points[object_id]= center#Update dictionary with IDs not used removedself.center_points = new_center_points.copy()return objects_bbs_ids
0、背景
① 修改TZ环境变量改变时区不能立即生效。要求设置时区后立即生效,只能用修改/etc/localtime方式。 ② 原文作者 Bill Seymour,想要查看原文,点击官网地址https://www.iana.org/time-zones下载 zic 源码,源码目录中的 tz…