NVIDIA VPI初探(3):2行代码轻松实现“视频背景抽离”

2021-10-13 15:02:14 浏览数 (1)

前面文章已经简单介绍NVIDIA VPI视觉开发接口提供的几个常用图像处理算法 (NVIDIA VPI初探(2):只需2行代码轻松实现常见图像算法),将这些原本比较复杂的算法封装成单一指令,就能大大减轻开发者去微调细节的时间消耗。本文是进一步地用一个高斯混合模型的技术,将视频背景部分抽离出来的应用,

这份范例代码在14-background_subtractor项目中,请自行挑选一个“背景固定”的视频作为测试,现在先执行范例看看是什么效果:

代码语言:javascript复制
 $ cd /opt/nvidia/vpi1/samples/02-stereo_disparity
 $ python3 main.py cuda ~/nvme120/data/video4test/C12.mp4

执行结果可以看这个视频:

可以发现右上方的背景图是“逐渐清晰”的,因为这个算法会去识别“移动物体”,然后逐帧记录比对之后,将移动物体抽离处理,只保留背景的部分,如果摄像头不固定,就没法将背景抽离,您可以尝试用手边自拍的小视频来做测试。

这个处理结果是很神奇!同样的,这个应用中的核心代码只有一行,就在main.py里的第78行(如下),这也是VPI的单指林算法的高阶封装接口。

代码语言:javascript复制
br

接下来第93行与96行代码(如下)则是将原读入图像,分解出前景(fgmask)与背景图(bgimage),最后再将前景图想转换成BGR8格式,存到文件里面。

代码语言:javascript复制
 fgmask, bgimage = bgsub(vpi.asimage(cvFrame, vpi.Format.BGR8), learnrate=0.01)
fgmask = fgmask.convert(vpi.Format.BGR8, backend=vpi.Backend.CUDA)

同样的,我们可以看到在视频读取与写入的部分,都是调用OpenCV的函数,再次印证前一篇文章所说的,VPI的目的是在补强“视觉算法”的部分,而不是在全面替代OpenCV的功能。

好了,这个系列的文章做完了,大家一起来试试NVIDIA VPI吧!

0 人点赞