前面文章已经简单介绍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吧!