实验目标

利用颜色直方图检测电影片段007.mp4, Godfather.mp4的镜头。
输入为视频文件名;输出为不同镜头的首尾帧;镜头按序号命名:001-1.jpg, 001-2.jpg, 002-1.jpg, 002-2.jpg, … 每一个镜头输出两个图像,对应与该镜头的首帧和尾帧(分别用-1,-2后缀表示)。

问题分析

本实验采用颜色直方图来检测电影片段中的镜头的切换,颜色直方图法首先将颜色空间分成为离散的颜色区间,计算每帧彩色图像中落入每个小区间的像素数目,得到其颜色直方图,然后计算两帧图像直方图的差值得到帧间差,直方图的优点是它对镜头的运动和图像内物体的运动不敏感,进而可以降低由此而引起的虚检测。
通过分析电影样本,可以发现其中电影007中,存在较多的爆炸,枪击,冒烟等画面,其中比较视频图像帧前后的差值较大,对于镜头切换检测有一定程度的影响。
同时考虑到人眼存在一个0.2秒的反应时间,电影镜头切换的频率存在上限值,即至少要间隔0.2*25=5帧图像,才有可能出现镜头切换。因此考虑到此约束条件,可以解决一部分的镜头切换检测中的遇到画面剧烈变化造成的误检测问题。
同时,查阅相关资料,发现在对直方图比较函数中,存在5中不同的比较方法,因此实验采用其中两种计算量较小,效果较好的两种比较方法进行比较。
由于,通过视频帧的彩色直方图之间的差异,来进行镜头切换的检测。因此,确定检测阈值,成为重要的一步,其中考虑到,算法模型的自适应性,尝试通过某种算法,可以自动生成适应于本电影的阈值。为此,本实验对阈值的自动生成也做了一些尝试。

方法流程设计

通过分析电影样本,首先通过截取视频的帧,得到视频的帧序列,然后计算其彩色直方图,起初,没有考虑到视频中存在许多诸如,爆炸,冒烟,枪击,等因素,直接利用彩色直方图,通过比较前一帧与后一帧的相关系数,来判断镜头的切换,通过实验的结果发现效果并不好,有很多漏检的情况,还有一些由于镜头画面发生较大变化导致的误检,如图所示的


如图所示,由于镜头画面发生了诸如,爆炸,射击等事件,使得相应的镜头检测出现误检测的情况。因此考虑到在计算图像彩色直方图前,需要进行预处理,将其中有相关的活动的因素去除。考虑到通过判断特定的像素值(比如爆炸会出现很多强光,烟雾是白色的),来过滤掉有关的像素值,进而达到其对彩色直方图的分布不产生影响。发现cv2中的calcHist()函数可以设置每个通道计算的亮度范围,由于默认的亮度范围是[0,256]。因此将通过采集上述事件主要的亮度范围,通过设置新的范围,来抑制干扰因素对直方图分布的影响。因此需要采集干扰因素的像素值,通过编写简单的程序来输出鼠标选定像素值的BGR值。(具体源代码见源文件)通过分析相关的像素值的分布,可以确定出较理想的亮度范围。其中对下图采集的采集点和相应BGR值如下表所示:

B G R
255 255 251
251 255 250
254 255 246

由上图可以分析出,对于干扰的因素,通过设定亮度范围来抑制,因此本实验采用ranges = [0,160,0,250,0,250],作为calcHist函数的参数。

自适应阈值计算方法

通过对实验数据的分析,想尝试一种方法可以自动生成阈值,来达到模型算法的泛化能力,以及提高对样本的自适应性。考虑到本问题类似于二分类,因此需要确定阈值来达到二分类的目的。由数据样本的分布,可以发现,其绝大多数视频帧之间的相关性都较高。如图2.3所示:

因此数据相关性集中分布在1.0。其中将非常接近于1.0的数据称为近似区间,分布区间就是相关系数在[min,1.0],其中min是相关系数中的最小值,则此样本的所有相关系数都在分布区间中,因此需要选取合适的阈值x,使得可以较好地进行分类。通过统计在近似区间帧的数量,计算出其占比rate,由于rate越大,阈值x也越大,同时默认分布区间的中心(min+1.0)/2,因此考虑到可以将分布区间的中心和1.0进行加权求和,来近似阈值x即
X = (1-rate)(1.0+min)/2+rate1.0**
通过样本数据,可以看出镜头不发生切换时,视频帧之间的近似值大约为0.001.
同时,实验采用两种不同的方法来比较彩色直方图的,一种是相关系数,另外一种是交集法,通过比较两种方法的结果,选出一个较好的比较方式。

效果展示

总结

通过本实验由007电影的镜头检测结果可以得出,相比较之下交集法的效果更好一点。但是对于画面变化剧烈的或者,仍存在误检测的情况。一方面通过设定镜头切换频率的最大值来约束对剧烈变化场景的检测,另一方面通过过滤掉特定区间亮度的像素值,对于视频中的剧烈变化的检测情况有所改善,同时对于阈值的设定方法提升了算法的泛化性,在电影Godfather中体现出较好的检测结果。

源代码

import os
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt#提取视频中的帧,保存在列表中
frame_list = []
cap = cv.VideoCapture('Data/Godfather.mp4')
fps = cap.get(5)
delay = int(1000/fps) - 5
while(cap.isOpened()):ret, frame = cap.read()#print(ret)if ret == False:breakframe_list.append(frame)#print(frame)cv.imshow('frame',frame)if cv.waitKey(delay) & 0xFF == ord('q'):break
cap.release()
cv.destroyAllWindows()
print(len(frame_list))
#计算直方图函数
def Computer_Histograms(frame):hist = cv.calcHist(images = [frame],channels = [0,1,2],mask = None,histSize = [8,8,8],ranges = [0,256,0,256,0,256])hist = hist.flatten()hist = hist / hist.sum()return hist#计算每帧图片的直方图
hist_list = []
for each in frame_list:hist = Computer_Histograms(each)hist_list.append(hist)
#基于相关系数比较直方图
correl_list = []
for i in range(len(hist_list)-1):correl = cv.compareHist(hist_list[i], hist_list[i+1], cv.HISTCMP_CORREL)correl_list.append(correl)
print(len(correl_list))#基于相关系数的比较直方图相似度图像
fig,ax = plt.subplots()
ax.plot(correl_list)
plt.show()#基于相似度的阈值设定
print(min(correl_list))
# print(correl_list)
num = 0
for each in correl_list:if 1.0 - each < 0.001:num += 1
rate = num/len(correl_list)
print(rate)
value = (1+min(correl_list))*0.5*(1-rate)+rate
print(value)#对视频图像帧进行镜头检测
lens_index = []pre_index = 0
#需要小于阈值且间隔大于5
for index in range(len(correl_list)):if correl_list[index] < value and index >= pre_index+5:lens_index.append(index)pre_index = index
#检测出的镜头切换的数量
print(len(lens_index))#将镜头切换的前一帧和后一帧保存
for i in range(len(lens_index)-1):cv.imwrite(str(i)+"-1.jpg",frame_list[lens_index[i]])cv.imwrite(str(i)+"-2.jpg",frame_list[lens_index[i+1]])#对视频图像帧进行镜头检测
lens_index = []pre_index = 0
#需要小于阈值且间隔大于5
for index in range(len(intersect)):if intersect[index] < value and index >= pre_index+5:lens_index.append(index)pre_index = index
#检测出的镜头切换的数量
print(len(lens_index))#将镜头切换的前一帧和后一帧保存
for i in range(len(lens_index)-1):cv.imwrite(str(i)+"-1.jpg",frame_list[lens_index[i]])cv.imwrite(str(i)+"-2.jpg",frame_list[lens_index[i+1]])

基于彩色直方图自适应检测电影镜头切换相关推荐

  1. 【OpenCV 例程200篇】48. 图像增强—彩色直方图匹配

    [OpenCV 例程200篇]48. 图像增强-彩色直方图匹配 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 图像直 ...

  2. 基于javaweb的在线电影售票系统设计和实现(java+springboot+ssm+mysql+jsp)

    基于javaweb的在线电影售票系统设计和实现(java+springboot+ssm+mysql+jsp) 运行环境 Java≥8.MySQL≥5.7 开发工具 eclipse/idea/myecl ...

  3. PyTorch深度学习实战 | 基于深度学习的电影票房预测研究

    基于深度学习的映前票房预测模型(Cross&Dense网络结构模型),该模型通过影片基本信息如:电影类型.影片制式.档期和电影的主创阵容和IP特征等信息对上映影片的票房进行预测. 本篇采用45 ...

  4. 远心镜头与普通镜头_什么使电影镜头与普通镜头不同?

    远心镜头与普通镜头 Good camera lenses don't come cheap, but if you're window shopping on Amazon or B&H Ph ...

  5. 大规模环境下基于语义直方图的多机器人实时全局定位图匹配

    文章:Semantic Histogram Based Graph Matching for Real-Time Multi-Robot Global Localization in Large Sc ...

  6. 彩色直方图均衡化实现

    #include <opencv2/opencv.hpp> int main() {// 图像获取及验证cv::Mat srcImage = cv::imread("..\\im ...

  7. ML之K-means:基于K-means算法利用电影数据集实现对top 100 电影进行文档分类

    ML之K-means:基于K-means算法利用电影数据集实现对top 100 电影进行文档分类 目录 输出结果 实现代码 输出结果 先看文档分类后的结果,一共得到五类电影: 实现代码 # -*- c ...

  8. ML之H-Clusters:基于H-Clusters算法利用电影数据集实现对top 100电影进行文档分类

    ML之H-Clusters:基于H-Clusters算法利用电影数据集实现对top 100电影进行文档分类 目录 输出结果 实现代码 输出结果 先看输出结果 实现代码 # -*- coding: ut ...

  9. python协同过滤电影推荐_基于协同过滤的电影推荐系统的设计与实现

    龙源期刊网 http://www.qikan.com.cn 基于协同过滤的电影推荐系统的设计与实现 作者:张玉叶

最新文章

  1. linux 565显示格式,RGB565转BMP格式 C语言程序
  2. android onpause时动画出错,Android生命周期之onPauseonStop
  3. [转载] 七龙珠第一部——第095话 悟空对抗克林
  4. python字符编码导致dict中key不同
  5. 2021版IDEA用Maven创建web项目
  6. ext中fieldLabel文本太宽的问题,以及Panel居中显示
  7. mongoDB3.4主从复制实现(第一种情况亲测)
  8. 服务器系统装软路由,服务器系统设置软路由
  9. nginx 带宽_前端工程师不可不知的Nginx知识
  10. hdu 杭电题目分类
  11. 英语作业(general version an narrow version about sth)
  12. [Axis2与Eclipse整合开发Web Service系列之二] Top-Down方式,通过WSDL逆向生成服务端
  13. MVC进阶学习--HtmlHelper控件解析(三)
  14. 对比几段代码,看看你是 Python 菜鸟还是老鸟
  15. 代码审计 企业级Web代码安全架构 完整版pdf
  16. cad的dwg文件转html文件,多种方式将CAD文件转化为JPG图片
  17. 面试想不带简历,老罗可以,你不行!
  18. Ubuntu 编译最新LLVM套件:LLVM 16.0
  19. Matlab plotyy画双纵坐标图实例
  20. 完美解决VS2003.Net fatal error LNK1201: 写入程序数据库“.pdb”时出错 - 细雨淅淅

热门文章

  1. 正则表达式包含某字符串且不包含某些字符串
  2. 通带纹波、阻带纹波、通带最大波纹和阻带最小衰减
  3. Markdown Cheat Sheet
  4. 计算机网络实验六 综合设计实验
  5. 修改服务器端口后防火墙要设置吗,服务器设置完防火墙需要重启吗
  6. ubuntu14.04搜狗输入法中文无法切换英文
  7. Java Web 图说
  8. 科技兴关,荣联与天津海关共建基因组数据库及分析平台
  9. 商品房买卖抵押贷款中的保险
  10. 数学建模里面灵敏度分析怎么写