91 lines
3.0 KiB
Python
91 lines
3.0 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""
|
||
Created on Mon Jul 29 10:28:21 2024
|
||
未来需将这一部分和轨迹分析代码集成
|
||
|
||
@author: ym
|
||
"""
|
||
import numpy as np
|
||
import cv2
|
||
from scipy.spatial.distance import cdist
|
||
|
||
class TProp:
|
||
def __init__(self, boxes):
|
||
|
||
self.boxes = boxes
|
||
|
||
|
||
|
||
|
||
|
||
class TProp:
|
||
'''抽象基类,不能实例化对象'''
|
||
def __init__(self, boxes):
|
||
'''
|
||
boxes: [x1, y1, x2, y2, track_id, score, cls, frame_index, box_index]
|
||
0 1 2 3 4 5 6 7 8
|
||
'''
|
||
# assert len(set(boxes[:, 4].astype(int))) == 1, "For a Track, track_id more than 1"
|
||
# assert len(set(boxes[:, 6].astype(int))) == 1, "For a Track, class number more than 1"
|
||
|
||
self.boxes = boxes
|
||
|
||
'''5个关键点(中心点、左上点、右上点、左下点、右下点 )坐标'''
|
||
self.compute_cornpoints()
|
||
|
||
'''5个关键点轨迹特征,可以在子类中实现,降低顺序处理时的计算量
|
||
(中心点、左上点、右上点、左下点、右下点 )轨迹特征'''
|
||
self.compute_cornpts_feats()
|
||
|
||
self.distmax = max(self.trajdist)
|
||
|
||
|
||
def compute_cornpoints(self):
|
||
'''
|
||
cornpoints 共10项,分别是个点的坐标值(x, y)
|
||
(center, top_left, top_right, bottom_left, bottom_right)
|
||
'''
|
||
boxes = self.boxes
|
||
cornpoints = np.zeros((self.frnum, 10))
|
||
cornpoints[:,0] = (boxes[:, 0] + boxes[:, 2]) / 2
|
||
cornpoints[:,1] = (boxes[:, 1] + boxes[:, 3]) / 2
|
||
cornpoints[:,2], cornpoints[:,3] = boxes[:, 0], boxes[:, 1]
|
||
cornpoints[:,4], cornpoints[:,5] = boxes[:, 2], boxes[:, 1]
|
||
cornpoints[:,6], cornpoints[:,7] = boxes[:, 0], boxes[:, 3]
|
||
cornpoints[:,8], cornpoints[:,9] = boxes[:, 2], boxes[:, 3]
|
||
|
||
self.cornpoints = cornpoints
|
||
def compute_cornpts_feats(self):
|
||
'''
|
||
'''
|
||
trajectory = []
|
||
trajlens = []
|
||
trajdist = []
|
||
trajrects = []
|
||
for k in range(5):
|
||
# diff_xy2 = np.power(np.diff(self.cornpoints[:, 2*k:2*(k+1)], axis = 0), 2)
|
||
# trajlen = np.sum(np.sqrt(np.sum(diff_xy2, axis = 1)))
|
||
|
||
X = self.cornpoints[:, 2*k:2*(k+1)]
|
||
|
||
traj = np.linalg.norm(np.diff(X, axis=0), axis=1)
|
||
trajectory.append(traj)
|
||
|
||
trajlen = np.sum(traj)
|
||
trajlens.append(trajlen)
|
||
|
||
ptdist = np.max(cdist(X, X))
|
||
trajdist.append(ptdist)
|
||
|
||
'''最小外接矩形:
|
||
rect[0]: 中心(x, y)
|
||
rect[1]: (w, h)
|
||
rect[0]: 旋转角度 (-90°, 0]
|
||
'''
|
||
rect = cv2.minAreaRect(X.astype(np.int64))
|
||
trajrects.append(rect)
|
||
|
||
self.trajectory = trajectory
|
||
self.trajlens = trajlens
|
||
self.trajdist = trajdist
|
||
self.trajrects = trajrects |