【发布时间】:2019-09-18 21:09:51
【问题描述】:
我想使用 ffmpeg 或 Python 从某人的视频中删除背景。如果我在任何地方录制视频,请检测视频中的人,然后删除除此人之外的任何内容。不要求绿色或单色背景,因为这可以通过 chromakey 完成,我不是在寻找那个。
我已经尝试过这种 (https://tryolabs.com/blog/2018/04/17/announcing-luminoth-0-1/) 方法,但它给了我矩形框的输出。它提供了足够的信息,因为要探索的区域足够缩小,但仍需要删除总背景。
我也尝试过grabcut (https://docs.opencv.org/4.1.0/d8/d83/tutorial_py_grabcut.html) 但需要用户交互否则结果不太好。
我也尝试使用ffmpeg 并找到了这个示例(http://oioiiooixiii.blogspot.com/2016/09/ffmpeg-extract-foreground-moving.html),但它需要静止图像,所以我尝试在与人录制视频之前拍摄背景图片,但需要做很多事情来区分背景图像和视频帧。
对于opencv 方法,我已经尝试过了。
img = cv.imread('pic.png')
mask = np.zeros(img.shape[:2], np.uint8)
bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)
rect = (39, 355, 1977, 2638)
cv.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0), 0, 1).astype('uint8')
img = img*mask2[:, :, np.newaxis]
plt.imshow(img), plt.colorbar(), plt.show()
但它也删除了一些人的部分。
也尝试了ffmpeg的方式,但效果不佳。
ffmpeg -report -y -i "img.jpg" -i "vid.mov" -filter_complex "[1:v]format=yuva444p,lut=c3=128[video2withAlpha],[0:v][video2withAlpha]blend=all_mode=difference[out]" -map "[out]" "output.mp4"
我所需要的只是一个人在任何正常背景下拍摄的图像/视频,而不需要像区域选择或任何其他类似的用户交互。 Luminoth 有训练过的数据,但那是给一盒人而不是确切的人,以便我可以删除。任何有关删除背景的帮助或指导将不胜感激。
【问题讨论】:
标签: python opencv machine-learning ffmpeg computer-vision