v1.1
支持本地视频测试
This commit is contained in:
+15
-1
@@ -14,6 +14,7 @@ class FishTracker:
|
||||
self.alerts = []
|
||||
|
||||
def process_frame(self, frame):
|
||||
"""返回处理后帧、告警列表、每条鱼的统计信息"""
|
||||
self.alerts.clear()
|
||||
h, w = frame.shape[:2]
|
||||
|
||||
@@ -31,6 +32,7 @@ class FishTracker:
|
||||
|
||||
# 3. 更新轨迹 & 绘制
|
||||
output_frame = frame.copy()
|
||||
track_stats = []
|
||||
for track in tracks:
|
||||
if not track.is_confirmed():
|
||||
continue
|
||||
@@ -44,6 +46,7 @@ class FishTracker:
|
||||
|
||||
# 计算速度(像素/秒)
|
||||
traj = self.trajectories[track_id]
|
||||
step_dist = 0
|
||||
if len(traj) >= 2:
|
||||
total_dist = 0
|
||||
total_time = 0
|
||||
@@ -51,6 +54,8 @@ class FishTracker:
|
||||
dx = traj[i][0] - traj[i-1][0]
|
||||
dy = traj[i][1] - traj[i-1][1]
|
||||
dist = np.sqrt(dx*dx + dy*dy)
|
||||
if i == len(traj) - 1:
|
||||
step_dist = dist
|
||||
dt = (traj[i][2] - traj[i-1][2]) / cv2.getTickFrequency()
|
||||
total_dist += dist
|
||||
total_time += dt
|
||||
@@ -62,12 +67,21 @@ class FishTracker:
|
||||
is_bottom = cy > h * 0.8
|
||||
|
||||
# 异常规则
|
||||
is_slow = speed < 15
|
||||
if speed < 15 and is_bottom:
|
||||
self.alerts.append(f"⚠️ 鱼 {track_id}: 低速({speed:.1f}px/s) + 沉底")
|
||||
|
||||
track_stats.append({
|
||||
"id": track_id,
|
||||
"speed": speed,
|
||||
"is_bottom": is_bottom,
|
||||
"is_slow": is_slow,
|
||||
"distance_delta": step_dist,
|
||||
})
|
||||
|
||||
# 绘制框和ID
|
||||
cv2.rectangle(output_frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
|
||||
cv2.putText(output_frame, f"Fish-{track_id}", (x1, y1 - 10),
|
||||
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
|
||||
|
||||
return output_frame, self.alerts
|
||||
return output_frame, self.alerts, track_stats
|
||||
Reference in New Issue
Block a user