1. Project Introduction
(1) 选题
视频镜头边缘检测与镜头内关键帧提取
(2) 工作简介
视频逐帧进行直方图绘制并按照 X2 做差
根据当前帧所处环境进行自适应阈值防缩得到镜头边缘帧
优化镜头边缘帧
进行自适应关键帧提取
(3) 开发环境
c++ opencv3.3.1
2. Technical Detailss
(1) 理论知识
边缘检测
基于直方图差异进行边缘检测,差异越大的帧越有可能是镜头边界处,且使用直方图的方法可以很好的避免镜头内对象运动而造成的差异,提高一定鲁棒性。同时算法应该兼顾几个方面的问题。
+ 相邻两个镜头边缘不应该太靠近
+ 镜头边缘帧与前一帧的差值应该是当前镜头所有帧差值中最大的
+ 镜头边缘帧与前一帧的差值应该普遍大于该镜头中所有帧的平均差值的倍数
+ 下一个镜头中,靠近这个镜头的部分的两帧之间的差值不应该出现明显大于这个镜头边缘帧与前一帧的差值的情况
关键帧提取
动态进行关键帧提取,不应该根据当前镜头的长短而应该根据当前镜头的变化剧烈程度,当前镜头变化越剧烈,则应该提取越多的关键帧,即便当前镜头并不长。相反,即便是一段很长的镜头,如果画面基本没变,我们也应该提取较少的关键帧。
如果当前镜头画面为全黑,我们不应该提取任何关键帧。
(2) 具体算法
- 对于每一帧我们用以下结构保存
struct m_frame {
int index_frame;
float distance;//与上一帧的差值
bool M;//是否有可能是镜头分界帧
bool KeyFrame;//是否是关键帧
};
//定义最小镜头长度
#define m_MinLengthOfShot 4
镜头边缘检测
计算帧与帧之间的差值
- 直方图差异利用如下公式计算
X2=⎧⎩⎨⎪⎪∑ki=1(hm