使用ffmpeg或Python从视频中删除随机背景

时间:2019-04-30 08:39:08

标签: python opencv machine-learning ffmpeg computer-vision

我想使用ffmpegPython从某人的视频中删除背景。如果我在任何地方录制视频,请检测视频中的那个人,然后删除那个人之外的任何东西。不要求使用绿色或单色背景,因为可以通过抠像键来完成,我也不需要这样做。

我已经尝试过这种(https://tryolabs.com/blog/2018/04/17/announcing-luminoth-0-1/)方法,但是它给了我矩形框的输出。由于要探索的区域足够狭窄,因此它很有信息,但仍然需要删除整个背景。 我也尝试过grabcuthttps://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有训练过的数据,但这是给人的盒子而不是确切的人,以便我删除。任何有关删除背景的帮助或指导将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以尝试基于深度学习的方法。这是一个示例存储库:

https://github.com/TianzhongSong/Person-Segmentation-Keras

这将为您屏蔽任意背景的人。只需使用opencv加载图像并使其通过网络即可。