背景分析"/>
视频背景分析
使用的方法: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:breakelse: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:breakelse: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:breakelse:break
这里为了效果更明显,我把摄像头对准了墙壁,可以看到如下效果。背景bg_img中没有显示我的手和笔,在mask中绘出了我的手和笔。说明他比较好的将背景和前景分割开了。
总结一下:
这里就用到了三个api
首先:bgfg = cv.createBackgroundSubtractorMOG2() 或 bgfg1 = cv.createBackgroundSubtractorKNN()bgfg.apply(frame) 来获取maskbgfg.getBackgroundImage() 来获取背景图
需要注意的是,获取背景图时不能跳过apply() 这一步。必须先使用了apply(frame)才能获取背景图
更多推荐
视频背景分析
发布评论