
使用的方法:KNN(机器学习)、GMM(概率分析)
目标:对于一个视频,区分出他的背景和前景(行人、船只等)
用到的api是:
def video_io_demo():capture = cv.VideoCapture(0)bgfg = cv.createBackgroundSubtractorMOG2()bgfg1 = cv.createBackgroundSubtractorKNN()while(True):ret,frame = ad()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 = ad()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
确实比去噪前要分割明显,视频下对比会更清楚。
接下来我想显示一下背景图,这里是用到了
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 = ad()if ret is True:cv.imshow("video_input",frame)mask = bgfg.apply(frame)bg_image = BackgroundImage()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) 来获取BackgroundImage() 来获取背景图
需要注意的是,获取背景图时不能跳过apply() 这一步。必须先使用了apply(frame)才能获取背景图
本文发布于:2024-03-12 14:39:23,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/1710649029144700.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
| 留言与评论(共有 0 条评论) |