使用闪亮对象改进背景提取(OpenCV/Python)
我一直在研究一种“有趣”的解决方案,它将来自安全摄像头的多个视频组合成一个视频,其想法是将前景运动在数小时内叠加到几秒钟内,以实现“快速预览”。感谢并让我走上了正确的道路 该项目是,任何人都可以看到。到目前为止,我已经使用了以下背景提取:使用闪亮对象改进背景提取(OpenCV/Python),python,opencv,Python,Opencv,我一直在研究一种“有趣”的解决方案,它将来自安全摄像头的多个视频组合成一个视频,其想法是将前景运动在数小时内叠加到几秒钟内,以实现“快速预览”。感谢并让我走上了正确的道路 该项目是,任何人都可以看到。到目前为止,我已经使用了以下背景提取: 使用各种算法的OpenCV背景减法 面具R-CNN 约洛夫3/TinyYolo 光流 (我还没有尝试检测+质心跟踪,下一步我会这么做) 根据我目前的实验,OpenCV的背景提取通常效果最好,因为它完全基于运动来提取前景。而且速度非常快。没错,它也会提取一些
- 使用各种算法的OpenCV背景减法
- 面具R-CNN
- 约洛夫3/TinyYolo
- 光流
- (我还没有尝试检测+质心跟踪,下一步我会这么做)
findContours
也做得不好
我已经尝试了几种方法,但我目前的方法已被记录在案,其要点是:
self.fgbg = cv2.createBackgroundSubtractorMOG2(detectShadows=False,
history=self.history)
frame_hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
frame_hsv[:,:,0] = 0 # see if removing intensity helps
# gray = cv2.cvtColor(frame_hsv, cv2.COLOR_BGR2GRAY)
# create initial background subtraction
frame_mask = self.fgbg.apply(frame_hsv)
# remove noise
frame_mask = cv2.morphologyEx(frame_mask, cv2.MORPH_OPEN, self.kernel_clean)
# blur to merge nearby masks, hopefully
frame_mask = cv2.medianBlur(frame_mask,15)
#frame_mask = cv2.GaussianBlur(frame_mask,(5,5),cv2.BORDER_DEFAULT)
#frame_mask = cv2.blur(frame_mask,(20,20))
h,w,_ = frame.shape
new_frame_mask = np.zeros((h,w),dtype=np.uint8)
copy_frame_mask = frame_mask.copy()
# find contours of mask
relevant = False
ctrs,_ = cv2.findContours(copy_frame_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
rects = []
# only select relevant contours
for contour in ctrs:
area = cv2.contourArea(contour)
if area >= self.min_blend_area:
x,y,w,h = cv2.boundingRect(contour)
pts = Polygon([[x,y], [x+w,y], [x+w, y+h], [x,y+h]])
if g.poly_mask is None or g.poly_mask.intersects(pts):
relevant = True
cv2.drawContours(new_frame_mask, [contour], -1, (255, 255, 255), -1)
rects.append([x,y,w,h])
# do a dilation to again, combine the contours
frame_mask = cv2.dilate(new_frame_mask,self.kernel_fill,iterations = 5)
frame_mask = new_frame_mask
我发现在不同的条件下有太多的变化,使用openCV的背景提取无法预测 所以我切换到yolov3进行对象识别(实际上,它是作为一个新选项添加的)。虽然TinyYOLO相当糟糕,但YoloV3似乎足够了,尽管速度要慢得多 不幸的是,鉴于YoloV3只做矩形而不做主题遮罩,我不得不切换到cv2的
addWeighted
方法,在混合帧的顶部混合一个新对象
示例:我发现不同条件下的变化太多,使用openCV的背景提取无法预测 所以我切换到yolov3进行对象识别(实际上,它是作为一个新选项添加的)。虽然TinyYOLO相当糟糕,但YoloV3似乎足够了,尽管速度要慢得多 不幸的是,鉴于YoloV3只做矩形而不做主题遮罩,我不得不切换到cv2的
addWeighted
方法,在混合帧的顶部混合一个新对象
示例:尝试使用createBackgroundSubtractorMOG增加变量int history=400。这意味着你需要更长的平均历史。这辆车在那里行驶和行驶的时间不会超过100帧,因此对于400帧前的平均值来说是异常值。同时调整背景比率变量。此阈值定义组件是否足够重要,可以包含在背景模型中。TB=0.9是默认值。对于alpha=0.001,这意味着在将模式视为前景之前,该模式应存在约105帧。我认为你应该在bgfg模型中尝试各种参数,以获得完美的分割输出。我先和莫格试过。我没有发现它能提供改进,但我同意,使用参数可能会有所帮助。不管怎样,我会继续尝试,有趣的项目。值得一提的是,使用createBackgroundSubtractorMOG增加变量int history=400。这意味着你需要更长的平均历史。这辆车在那里行驶和行驶的时间不会超过100帧,因此对于400帧前的平均值来说是异常值。同时调整背景比率变量。此阈值定义组件是否足够重要,可以包含在背景模型中。TB=0.9是默认值。对于alpha=0.001,这意味着在将模式视为前景之前,该模式应存在约105帧。我认为你应该在bgfg模型中尝试各种参数,以获得完美的分割输出。我先和莫格试过。我没有发现它能提供改进,但我同意,使用参数可能会有所帮助。不管怎样,我会继续尝试,有趣的项目。值得竖起大拇指