前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV趣味应用系列--grabCut人物背景替换

OpenCV趣味应用系列--grabCut人物背景替换

作者头像
Color Space
发布2022-12-22 15:59:50
5760
发布2022-12-22 15:59:50
举报
文章被收录于专栏:OpenCV与AI深度学习

本文将使用grabCut来提取图像中的人物,同时使用mask将提取的人物贴到新的背景中,实现给人物替换背景的功能。

下面是我们将使用的原图,我们将提取图中的人物

首先我们需要手动绘制矩形框框选人物ROI,使用的函数是 cv2.selectROI()此函数主要用于目标跟踪中,允许我们使用鼠标框选ROI,同时还可以选择是否中心画十字或者是否从中心开始画矩形,效果如下:

使用cv2.selectROI函数会得到我们框选的ROI

代码语言:javascript
复制
# 获取鼠标选择的ROI区域
roi = src[int(r[1]):int(r[1]+r[3]), int(r[0]):int(r[0]+r[2])]
# src备份
img = src.copy()
# 绘制框选的ROI区域
cv2.rectangle(img, (int(r[0]), int(r[1])),(int(r[0])+int(r[2]), int(r[1])+ int(r[3])), (255, 0, 0), 2)

然后可以使用cv2.grabCut提取前景

代码语言:javascript
复制
bgdmodel = np.zeros((1,65),np.float64)
fgdmodel = np.zeros((1,65),np.float64)

# grabCut算法进行图像分割
cv2.grabCut(src,mask,rect,bgdmodel,fgdmodel, 11, mode=cv2.GC_INIT_WITH_RECT)

mask2 = np.where((mask==1) + (mask==3), 255, 0).astype('uint8')

最后加载新的背景图片,将背景模糊虚化,然后使用mask将提取的前景贴到新背景上

代码语言:javascript
复制
background = cv2.imread("./bg.jpg")
h, w, ch = src.shape
background = cv2.resize(background, (w, h))
cv2.imwrite("background.jpg", background)

se = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
cv2.dilate(mask2, se, mask2)
mask2 = cv2.GaussianBlur(mask2, (5, 5), 0)
# 背景模糊
background = cv2.GaussianBlur(background, (0, 0), 15)
mask2 = mask2/255.0
a =  mask2[..., None]

result = a* (src.astype(np.float32)) +(1 - a) * (background.astype(np.float32))

cv2.imshow("result", result.astype(np.uint8))

最终效果如下:

换一张新图片试试:

框选人物区域ROI:

最终效果:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV与AI深度学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档