Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用闪亮对象改进背景提取(OpenCV/Python)_Python_Opencv - Fatal编程技术网

使用闪亮对象改进背景提取(OpenCV/Python)

使用闪亮对象改进背景提取(OpenCV/Python),python,opencv,Python,Opencv,我一直在研究一种“有趣”的解决方案,它将来自安全摄像头的多个视频组合成一个视频,其想法是将前景运动在数小时内叠加到几秒钟内,以实现“快速预览”。感谢并让我走上了正确的道路 该项目是,任何人都可以看到。到目前为止,我已经使用了以下背景提取: 使用各种算法的OpenCV背景减法 面具R-CNN 约洛夫3/TinyYolo 光流 (我还没有尝试检测+质心跟踪,下一步我会这么做) 根据我目前的实验,OpenCV的背景提取通常效果最好,因为它完全基于运动来提取前景。而且速度非常快。没错,它也会提取一些

我一直在研究一种“有趣”的解决方案,它将来自安全摄像头的多个视频组合成一个视频,其想法是将前景运动在数小时内叠加到几秒钟内,以实现“快速预览”。感谢并让我走上了正确的道路

该项目是,任何人都可以看到。到目前为止,我已经使用了以下背景提取:

  • 使用各种算法的OpenCV背景减法
  • 面具R-CNN
  • 约洛夫3/TinyYolo
  • 光流
  • (我还没有尝试检测+质心跟踪,下一步我会这么做)
根据我目前的实验,OpenCV的背景提取通常效果最好,因为它完全基于运动来提取前景。而且速度非常快。没错,它也会提取一些东西,比如移动树叶等,但我们可以努力去除这些东西

下面是一个将3小时的视频混合到一个短视频中的示例。

我目前面临的挑战是,它对闪亮的物体(如汽车)做得不好。

以下是一个例子:

背景减法在为闪亮的对象提取多边形方面一直做得不好,
findContours
也做得不好

我已经尝试了几种方法,但我目前的方法已被记录在案,其要点是:

  • 将帧转换为HSV
  • 去除强度(我在另一篇关于闪亮物体的SO文章中读到)
  • 应用背景减法
  • 使用MORPH_OPEN清除外部噪音
  • 模糊遮罩,希望在斑点附近连接
  • 在新遮罩上查找轮廓
  • 仅保留某个最小区域的轮廓
  • 创建一个新的遮罩,在这里我们只绘制这些带有填充的轮廓
  • 进行最后一次放大,以连接新遮罩的紧密填充轮廓 10.使用此新遮罩从帧中提取前景,并将其与当前混合视频叠加
  • 有人对如何改进反射对象的提取有什么建议吗

     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模型中尝试各种参数,以获得完美的分割输出。我先和莫格试过。我没有发现它能提供改进,但我同意,使用参数可能会有所帮助。不管怎样,我会继续尝试,有趣的项目。值得竖起大拇指