参考自
《 K e y F r a m e E x t r a c t i o n o f O n l i n e V i d e o B a s e d o n O p t i m i z e d F r a m e D i f f e r e n c e 》 《Key Frame Extraction of Online Video Based on Optimized Frame Difference》 《KeyFrameExtractionofOnlineVideoBasedonOptimizedFrameDifference》

作者
H u a y o n g L i u , W e n t i n g M e n g Huayong Liu, Wenting Meng HuayongLiu,WentingMeng等人

帧差

首先对帧间进行平滑,减少过小的差异。
其次计算帧间差分均值。
最后计算局部最值,因为量过大,所以需要设计一个带局部最值窗口的求极值方法。
准确说就是,仅当你是 [ l , r ] [l,r] [l,r]区间的最值是你才是我们需要的极值。

所有极值点都是关键帧。
最后得到的分数是 6.89 6.89 6.89

gaoimport numpy as np
import cv2ansl = [1,94,132,154,162,177,222,236,252,268,286,310,322,255,373,401,
423,431,444,498,546,594,627,681,759,800,832,846,932,1235,1369,1438,1529,1581,1847]
ansr = [93,131,153,161,176,221,235,251,267,285,309,321,354,372,400,
422,430,443,497,545,593,626,680,758,799,831,845,931,1234,1368,1437,
1528,1580,1846,2139]#关键帧区间
ansl = np.array(ansl)
ansr = np.array(ansr)cap = cv2.VideoCapture('D:/ai/CV/pyt/1.mp4')
Frame_rate = cap.get(5)#一秒多少帧
Frame_number = cap.get(7)#帧数
Frame_time = 1000 / Frame_rate;#一帧多少秒
len_windows = 0
local_windows = 0def smooth(swift_img,windows):r = swift_img.shape[1]c = swift_img.shape[2]for i in range(r):for j in range(c):L = swift_img[:,i,j]L = np.convolve(L,np.ones(windows),'same')swift_img[:,i,j] = Lreturn swift_imgdef get_block(img):img = np.array(img)return imgdef dif(img1,img2):diff = img1 - img2diff = np.abs(np.array(diff))diff = diff.mean()return diffdef get_img(now_time = 0,get_number = Frame_number):#便于算法学习swift_img = []#转换后index = 0#标记第几个帧time = now_time#当前时间while (cap.isOpened()):cap.set(cv2.CAP_PROP_POS_MSEC,time)ret,img = cap.read()#获取图像if not ret:breakimg0 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换成灰度图img1 = get_block(img0)swift_img.append(img1)time += Frame_timeindex += 1if index >= get_number:breakif index % 50 ==0:print("当前到达"+str(index))swift_img = np.array(swift_img)return swift_imgdef get_key_frame(swift_img,local_windows):L = []L.append(0)for i in range(swift_img.shape[0]-1):temp = dif(swift_img[i],swift_img[i+1])L.append(temp)L = np.array(L)TL = []for i in range(L.shape[0]):l = i - local_windows // 2r = i + local_windows // 2l = max(l,0)r = min(r,L.shape[0])if i == l + np.argmax(L[l:r]):TL.append(True)else:TL.append(False)
#    print(TL)TL = np.array(TL)return TLdef preserve(L):num = 0time = 0for i in range(L.shape[0]):if L[i] == False:continuenum += 1cap.set(cv2.CAP_PROP_POS_MSEC,time)ret,img = cap.read()#获取图像cv2.imwrite('./1.1/{0:05d}.jpg'.format(num),img)#保存关键帧time += Frame_timedef cal_ans(cal_L,l,r):rate = []add = 0right = 0for j in range(ansl.shape[0]):num = 0if not (l <= j and j <= r):continuell = ansl[j]rr = ansr[j]for i in range(cal_L.shape[0]):if cal_L[i] == False:continueif j == 0 :print(i)if i + ansl[l] >= ll and i + ansl[l] <= rr:num += 1if num == 0:rate.append(0.0)else:right += 1if num == 1:rate.append(6.0)continueadd += num - 1rate.append(6.0)rate = np.array(rate)ret = np.sum(rate) / rate.shape[0]print("多余的个数:")print(add)add = add / (5 * (r - l + 1))add = min(add , 1)print("多余的占比:")print(add)print("正确的评分:")print(right)ret += 4 * (1 - add) * right / (r - l + 1)#总共帧数中只有正确的部分才考虑时间因素。print("评分是:")print(ret)return retdef study():window = 1local = 2mmax = 0lindex = 4rindex = 10for i in range(10):tmp = 1 + ifor j in range(10):Tmp = 2 + jprint("当前参数: "+"卷积窗口"+str(tmp)+"最值窗口"+str(Tmp))tmp_img = get_img(ansl[lindex],ansr[rindex])tmp_img = smooth(tmp_img,tmp)tmp_L = get_key_frame(tmp_img,Tmp)ttmp = cal_ans(tmp_L,lindex,rindex)if ttmp > mmax:window = tmplocal = Tmpmmax = ttmpprint("分割线--------------------")return window,locallen_windows,local_windows = study()
print("最终:")
print(len_windows)
print(local_windows)
print("")swift_img = get_img()
swift_img = smooth(swift_img,len_windows)
cal_L= get_key_frame(swift_img,local_windows)
cal_ans(cal_L,0,ansl.shape[0]-1)
#preserve(cal_L)#结果:
#6.89

关键帧提取——帧差法提取关键帧(2)相关推荐

  1. matlab帧间差分法前景提取_matlab采用帧差法实现运动目标检测

    帧间差分法是一种通过对视频图像序列中相邻两帧作差分运算来获得运动目标轮廓的方法,它可以很好地适用于存在多个运动目标和摄像机移动的情况.当监控场景中出现异常物体运动时,帧与帧之间会出现较为明显的差别,两 ...

  2. 相邻帧差法和三帧差法

    相邻帧差法和三帧差法 原文地址:https://blog.csdn.net/dcrmg/article/details/52234929 帧间差分法是通过对视频中相邻两帧图像做差分运算来标记运动物体的 ...

  3. 目标检测、追踪梳理:帧差法、光流法、背景减除法

    (0)总览 运动目标检测是指在序列图像中检测出变化区域并将运动目标从背景图像(背景层)中提取出来.通常情况下,目标分类.跟踪和行为理解等后处理过程仅仅考虑图像中对应于运动目标的像素区域(前景层),因此 ...

  4. opencv进阶-背景建模-(帧差法与混合高斯模型)

    背景减除(Background Subtraction)是许多基于计算机视觉的任务中的主要预处理步骤.如果我们有完整的静止的背景帧,那么我们可以通过帧差法来计算像素差从而获取到前景对象.但是在大多数情 ...

  5. 数字图像处理拓展题目——利用Matlab实现动态目标检测 二帧差法、ViBe法、高斯混合模型法,可应用于学生递东西行为检测

    1.二帧差法实现动态目标检测 先上效果图: 利用GUI界面显示出来效果图为: 实现流程 1.利用matlab中的VideoReader函数读取视频流. 2.帧差法:获得视频帧数,用for循环对图像每相 ...

  6. 视频处理:帧差法、光流法和背景减除法的视频目标识别

    视频处理:帧差法.光流法和背景减除法的视频目标识别视频处理:帧差法.光流法和背景减除法的视频目标识别视频处理:帧差法.光流法和背景减除法的视频目标识别 1.调用摄像头 函数1:cv2.VideoCap ...

  7. Python与OpenCV(一)——基于帧差法的运动目标检测程序分析

    OpenCV提供了强大的图像处理功能,与Python的结合堪称完美... 这一次,我们试一下用帧差法来完成对运动目标的检测与跟踪. 帧差法的原理是这样的:由于摄像机采集的视频序列具有连续性的特点,所以 ...

  8. 图像处理+帧差法实现对车辆的识别框选

    每一帧一个动作,连接起形成一个动画 帧差法:对每一帧进行分析,对帧内分为动态和静态物体,前一帧与后一帧相对移动的物体识别出. opencv中有专门对帧差的函数,以识别运动中的物体 原视频图像: 函数设 ...

  9. 结合帧差法与窗口搜索的车道线跟踪方法——第一篇处女座

    还好昨天舍友的提醒,抓紧时间转投别的正规杂志. 目前已经投到正规杂志社. 代码在文章发表成功之后才会公布. 之前matlab的篇,等忙过这阵子,会发百度云链接. 然鹅!可能因为投到了假的<电子器 ...

最新文章

  1. 第三代测序平台简介-单分子实时测序
  2. git换行符之autoCRLF配置的意义
  3. 今年Java面试必问的这些技术面,看完这一篇你就懂了
  4. 一种改进的快速人脸检测算法
  5. PyTorch教程(五):Broadcasting
  6. 【MATLAB统计分析与应用100例】案例008:调用rand函数生成均匀分布随机数
  7. 安卓手机端运行的adb工具_MQTT通信手机端接收生产车间设备运行信息3
  8. java学习(77):GUL下拉菜单框和滚动条
  9. C语言中的数组的使用——混乱的内存管理
  10. iPhone 13系列上线1小时 京东预约人数破20万
  11. 【渝粤题库】陕西师范大学152201 公共行政学
  12. 个人电子设计步骤整理
  13. Hibernate 学习的书-夏昕(1)
  14. reviewboard升级
  15. 使用ImageJ软件计算信噪比(SNR)的小工具
  16. github使用Personal access tokens的方法
  17. if else 的使用
  18. HTTP取消SSL认证
  19. 这应该是最全面的MySQL知识点总结啦
  20. 小资金超短线如何实现快速翻倍?

热门文章

  1. Three Character Classic 三字经
  2. 文档点击链接无法自动跳转浏览器+google浏览器重启无法继续浏览上次打开的网页
  3. 各种坐标系下坐标转换关系
  4. 屌丝程序员和技术大拿的区别是什么?
  5. php+mysql 留言板系统 登录 管理员 审核回复 学生适用
  6. 计算机专业英语09章在线测,審计学第09章在线测试.doc
  7. 设计模式 - 软件设计的七大原则
  8. 【转】Eclipse下Tomcat项目部署路径问题(.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps)
  9. (48)STM32——图片显示实验
  10. Blender中文场景概念原画创作教程