视频背景分析

使用的方法:KNN(机器学习)、GMM(概率分析)

目标:对于一个视频,区分出他的背景和前景(行人、船只等)

用到的api是:

cv.createBackgroundSubtractorMOG2()  或   cv.createBackgroundSubtractorKNN()
def video_io_demo():
    capture = cv.VideoCapture(0)
    bgfg = cv.createBackgroundSubtractorMOG2()
    bgfg1 = cv.createBackgroundSubtractorKNN()
    while(True):
        ret,frame = capture.read()
        if ret is True:
            cv.imshow("video_input",frame)
            mask = bgfg.apply(frame)
            cv.imshow("result", mask)
            c = cv.waitKey(2)
            if c==27:
                break
        else:
            break

我们通过摄像头来测试一下,返回一个mask(mask即是背景减去原图后的前景)

为什么大晚上在家要戴口罩,因为口罩比我脸白,轮廓更明显……

可以看到右边还是有许多噪点,于是用开操作去一下噪声

def video_io_demo():
    capture = cv.VideoCapture(0)
    bgfg = cv.createBackgroundSubtractorMOG2()
    bgfg1 = cv.createBackgroundSubtractorKNN()
    k = cv.getStructuringElement(cv.MORPH_RECT,(3,3))
    while(True):
        ret,frame = capture.read()
        if ret is True:
            cv.imshow("video_input",frame)
            mask = bgfg.apply(frame)
            mask = cv.morphologyEx(mask,cv.MORPH_OPEN,k)
            cv.imshow("result", mask)
            c = cv.waitKey(2)
            if c==27:
                break
        else:
            break

确实比去噪前要分割明显,视频下对比会更清楚。

接下来我想显示一下背景图,这里是用到了

bgfg.getBackgroundImage()   这个方法
def video_io_demo():
    capture = cv.VideoCapture(0)
    bgfg = cv.createBackgroundSubtractorMOG2()
    bgfg1 = cv.createBackgroundSubtractorKNN()
    k = cv.getStructuringElement(cv.MORPH_RECT,(3,3))
    while(True):
        ret,frame = capture.read()
        if ret is True:
            cv.imshow("video_input",frame)
            mask = bgfg.apply(frame)
            bg_image = bgfg.getBackgroundImage()
            mask = cv.morphologyEx(mask,cv.MORPH_OPEN,k)
            cv.imshow("result", mask)
            cv.imshow("bg_img", bg_image)
            c = cv.waitKey(2)
            if c==27:
                break
        else:
            break

这里为了效果更明显,我把摄像头对准了墙壁,可以看到如下效果。背景bg_img中没有显示我的手和笔,在mask中绘出了我的手和笔。说明他比较好的将背景和前景分割开了。

 

总结一下:

这里就用到了三个api

首先:bgfg = cv.createBackgroundSubtractorMOG2() 或  bgfg1 = cv.createBackgroundSubtractorKNN()

bgfg.apply(frame)   来获取mask

bgfg.getBackgroundImage()   来获取背景图

需要注意的是,获取背景图时不能跳过apply() 这一步。必须先使用了apply(frame)才能获取背景图

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值