基于图像进行三维重建时,需要从视频中提取关键帧,构成图片集合。
image从视频中提取关键帧时,一般的方法是按照固定帧率(时间间隔)来进行提取图片。但由于拍摄视频时,场景视角变化幅度有时大有时小,按照固定帧率提取图片集,如果帧率过小,会丢失一些对三维重建比较关键的帧,而如果帧率过大,则提取的图片集合过大,造成不必要的冗余。
本质上来说,不存在一个合适的帧率进行图片提取。用于三维重建的图片集合,只要保持相邻的两个图片之间的场景重复度足够大即可。而根据固定帧率从视频中提取图片集合的方式,没有抓住其本质。
本文提出一种方法,利用深度学习提取局部特征,根据视频中场景视角的变化幅度来提取关键帧,提高了三维重建的效果,且减少了用于三维重建的图片集的冗余。
方法具体过程如下:
- 将视频的当前帧作为关键帧放入图片集合,利用神经网络模型superpoint,对当前帧进行关键点(像素点坐标集合)和局部特征(像素点对应的特征,用于表示像素点的唯一性)的提取,存储关键点为cur_keypoints,存储局部特征为cur_descriptors;
- 对视频下一帧,利用同样的方法进行关键点和局部特征的提取,存储关键点为next_keypoints,存储局部特征为next_descriptors。将next_descriptors与cur_descriptors进行匹配,确定出next_keypoints中与cur_keypoints中相对应的关键点,计算出对应关键点之间的距离,然后求出所有对应关键点的平均距离:distance;
- 如果步骤2中求出的distance大于等于预先设定的距离D,则将步骤2中的帧作为当前帧,返回到步骤1。如果步骤2中求出的distance<D,则返回步骤2考察视频的下一帧。如果视频读取完毕,则结束。
本方法的优点:
- 避免了由于提取帧率过小,而丢失一些对三维重建时较为关键的帧;
- 避免了由于提取帧率过大,而造成图片集合不必要的冗余;
- 利用深度学习方法提取关键点和局部特征,对不同场景具有很好的鲁棒性;
- 抓住了关键帧提取的本质。
现已将代码上传到github上,以供大家参考学习。代码地址为:https://github.com/markshih91/video_keyframe_extraction
网友评论