You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行trackpy处理背景减除视频时出现KeyError: 'frame'错误

问题:trackpy追踪细胞时出现KeyError: 'frame'

错误信息

raise KeyError(key) from err
KeyError: 'frame'

原代码

import cv2
import trackpy as tp

cap = cv2.VideoCapture('0.3_1_23.64fps.avi')
fgbg = cv2.createBackgroundSubtractorKNN()

while(1):
    ret, frame = cap.read()
    if ret == 1:
        fgmask = fgbg.apply(frame)
        #cv2.imshow('fgmask',fgmask)
        #k = cv2.waitKey(30) & 0xff
        #if k == 27:
        #   break
    else:
        break

cap.release()
cv2.destroyAllWindows()

f = tp.locate(fgmask, 25, invert=False, minmass= 30)
#tp.annotate(f, fgmask)
t = tp.link(f, 5, memory=5)

问题原因

你的代码只保留了视频最后一帧的前景掩码,且tp.locate返回的结果没有frame列。tp.link是用来追踪多帧间的目标,必须依赖frame字段区分不同帧的检测结果,因此会抛出该错误。

修正后的代码

import cv2
import trackpy as tp
import pandas as pd

cap = cv2.VideoCapture('0.3_1_23.64fps.avi')
fgbg = cv2.createBackgroundSubtractorKNN()
all_features = []
frame_num = 0

while True:
    ret, frame = cap.read()
    if not ret:
        break
    
    fgmask = fgbg.apply(frame)
    # 检测当前帧的细胞目标
    features = tp.locate(fgmask, 25, invert=False, minmass=30)
    if features is not None:
        # 标记当前帧序号,这是trackpy追踪的必填字段
        features['frame'] = frame_num
        all_features.append(features)
    
    frame_num += 1

cap.release()
cv2.destroyAllWindows()

# 合并所有帧的检测结果并执行追踪
if all_features:
    f = pd.concat(all_features)
    t = tp.link(f, 5, memory=5)
    print(t.head())
else:
    print("未检测到任何细胞目标")

关键说明

  • 用列表all_features存储每帧的检测结果,避免只保留最后一帧数据
  • 每帧检测后添加frame列,标记当前帧序号,满足tp.link的必填要求
  • 用pd.concat合并多帧数据,确保追踪函数能处理完整的序列
  • 增加空值判断,避免无检测结果时触发报错

内容的提问来源于stack exchange,提问作者user21716287

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:00:06