如何从网络摄像头 OpenCV 裁剪圆形图像并删除背景

Posted

技术标签:

【中文标题】如何从网络摄像头 OpenCV 裁剪圆形图像并删除背景【英文标题】:How to crop circle image from webcam OpenCV and remove background 【发布时间】:2020-05-23 21:29:40 【问题描述】:

我正在应用过滤器。通过使用 OpenCv 实时网络摄像头是打开的,它检测面部并应用过滤器。但我想将脸部裁剪成圆形并删除多余的背景并保存图像。

例如:

到这个

如何在 python 中实现?

【问题讨论】:

欢迎来到 ***。本网站不作为一般问题解决门户。社区将帮助您获得可行的解决方案,但您应该与图像共享您的代码,以显示您已经完成但没有工作的事情。阅读“如何创建一个最小的、可重现的示例”(***.com/help/minimal-reproducible-example)、“什么是好的主题”(***.com/help/on-topic)和“我如何提出一个好的问题”(***.com/help/how-to-ask)?请确定您有哪些关于人脸位置和大小的数据,以便我们显示裁剪 如果你有中心坐标,你可以这样做How to create a circular thumbnail using python pillow and overlap on background image或cropping an image in a circular way, using python 另见:How can I create a circular mask for a numpy array? 【参考方案1】:

这个想法是创建一个黑色蒙版,然后使用cv2.circle() 绘制所需区域以白色裁剪。从那里我们可以将cv2.bitwise_and() 与原始图像和蒙版一起使用。要裁剪结果,我们可以在掩码上使用cv2.boundingRect() 来获得 ROI,然后使用 Numpy 切片提取结果。对于这个例子,我使用中心点作为(335, 245)。您可以调整圆的半径来增大或减小圆的大小。

代码

import cv2
import numpy as np

# Create mask and draw circle onto mask
image = cv2.imread('1.jpg')
mask = np.zeros(image.shape, dtype=np.uint8)
x,y = 335, 245
cv2.circle(mask, (x,y), 110, (255,255,255), -1)

# Bitwise-and for ROI
ROI = cv2.bitwise_and(image, mask)

# Crop mask and turn background white
mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
x,y,w,h = cv2.boundingRect(mask)
result = ROI[y:y+h,x:x+w]
mask = mask[y:y+h,x:x+w]
result[mask==0] = (255,255,255)

cv2.imshow('result', result)
cv2.waitKey()

【讨论】:

以上是关于如何从网络摄像头 OpenCV 裁剪圆形图像并删除背景的主要内容,如果未能解决你的问题,请参考以下文章

从保存的图像中预测情绪(OpenCV 网络摄像头)

OpenCV 从摄像头裁剪实时提要

如何opencv读取摄像头并保存每一帧图像?

如何opencv读取摄像头并保存每一帧图像

如何从 OpenCV 中的图像中删除空格?

如何裁剪轮廓的内部区域?