这篇“opencv如何去除背景”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“opencv如何去除背景”文章吧。
背景减除法是很多基于视觉的应用的一个主要预处理步骤。例如使用一个静止的摄像头拍摄进出房间的人数,或是交通摄像头捕获车辆信息等。在以上的例子中,首先你需要单独把人和交通工具提取出来。从技术上来说,你需要从静止的背景中提取移动前景目标。
通常情况下,我们的背景往往是未知的,因此需要通过一定的方法得到视频背景,然后用新的图像减去背景图片即可。
在opencv中提供了几种背景减除的方法:
这是基于高斯混合模型的算法,混合模型表示了观测数据在总体中的概率分布,高斯分布即正态分布,正态分布如下图:
(图片来源于网络)
而高斯混合模型就是使用高斯分布的混合模型,由于高斯分布具有良好的数学性质和计算性能,它的概率分布遵循高斯分布。
cv2.bgsegm.createBackgroundSubtractorMOG()使用时可以不用传入参数
import cv2 cap = cv2.VideoCapture(0) fgbg = cv2.bgsegm.createBackgroundSubtractorMOG() se = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) while cap.isOpened(): ret, frame = cap.read() # 用于计算前景掩模 fgmask = fgbg.apply(frame) _, binary = cv2.threshold(fgmask, 215, 255, cv2.THRESH_BINARY) binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, se) res = cv2.bitwise_and(frame, frame, mask=binary) cv2.imshow("res", res) if cv2.waitKey(1000 // 12) & 0xff == ord('q'): break cap.release() cv2.destroyAllWindows()
运行结果:
它是改进的高斯混合模型,为各个参数设置了一些合适的值。
import cv2 cap = cv2.VideoCapture(0) fgbg = cv2.createBackgroundSubtractorMOG2() se = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) while cap.isOpened(): ret, frame = cap.read() fgmask = fgbg.apply(frame) _, binary = cv2.threshold(fgmask, 215, 255, cv2.THRESH_BINARY) binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, se) backImage = fgbg.getBackgroundImage() res = cv2.bitwise_and(frame, frame, mask=binary) cv2.imshow("backImage", backImage) cv2.imshow("res", res) if cv2.waitKey(1000 // 12) & 0xff == ord('q'): break cap.release() cv2.destroyAllWindows()
运行结果:
GMG:Geometric Multigid,几何多重网格。它默认使用前120帧图像进行建模,使用贝叶斯推断方法判断可能的前景物体。
import cv2 cap = cv2.VideoCapture(0) fgbg = cv2.bgsegm.createBackgroundSubtractorGMG() se = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) while cap.isOpened(): ret, frame = cap.read() fgmask = fgbg.apply(frame) _, binary = cv2.threshold(fgmask, 215, 255, cv2.THRESH_BINARY) binary = cv2.morphologyEx(binary, cv2.MORPH_OPEN, se) res = cv2.bitwise_and(frame, frame, mask=binary) cv2.imshow("res", res) if cv2.waitKey(1000 // 12) & 0xff == ord('q'): break cap.release() cv2.destroyAllWindows()
运行结果:
以上这三种方法对于检测运动物体行之有效,但如果检测静态物体就不适合了。
在可以确定背景时采用帧差法,此方法不仅可以用于动态目标检测,也能检测静态目标。
帧差法需要一个变量来检测当前是第几帧。即通过后面的帧减去第一帧得到所需前景。
import cv2 cap = cv2.VideoCapture(0) frameNum = 0 while cap.isOpened(): ret, frame = cap.read() frameNum += 1 tmp = frame.copy() if frameNum == 1: bgFrame = cv2.cvtColor(tmp, cv2.COLOR_BGR2GRAY) elif frameNum > 1: foreFrame = cv2.cvtColor(tmp, cv2.COLOR_BGR2GRAY) foreFrame = cv2.absdiff(foreFrame, bgFrame) _, thresh = cv2.threshold(foreFrame, 30, 255, cv2.THRESH_BINARY) gaussian = cv2.GaussianBlur(thresh, (3, 3), 0) cv2.imshow('gaussian', foreFrame) if cv2.waitKey(1000 // 12) & 0xff == ord('q'): break cap.release() cv2.destroyAllWindows()
运行结果:
上述除了使用滤波的方法,也可以直接用cv2.subtract()进行图像减法运算。
以上就是关于“opencv如何去除背景”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。