运行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
相关产品推荐
相关产品推荐

