!!!下面所有代码都是自己在github上搜到的,作者的名字是卢涛!!!
https://github.com/3140102441/Video-key-frame-extraction
运行是在matlab下运行的,一共四个脚本文件。
1、视频变成一帧一帧的图片,第一步运行:read_frame
obj = VideoReader('D:\fly.avi');%输入视频位置,自行根据视频位置修改D:\fly.avi
2、第一种方法:绝对帧差法,运行jueduizhencha
NOF=1538; %图片数量,注意手动修改,根据第一步运行出来的帧总数NOF自行修改
file_path = 'D:\Documents\MATLAB\lutao\images\';% 图像文件夹路径,根据第一步运行出来的帧的位置自己修改
运行结果会显示出来,镜头切换的帧是哪一帧
我感觉对于突变严重的视频检测比较准确,总体来说不是很准确
3、第二种感知哈希法:第一步仍然是运行read_frame,然后运行ganzhihaxi
运行结果会显示出来,镜头切换的帧是哪一帧
比较准确,会有误检
4、图片相关系数法:第一步仍然是运行read_frame,然后运行picture_xiangguanxishu
这三种方法里面最准确的一种方法
将视频读取为一帧一帧的图片
obj = VideoReader('D:\fly.avi');%输入视频位置
NOF=obj.NumberOfFrames;% 帧的总数
mkdir([cd,'/images']);%建立目录
directory=[cd,'/images/'];
for i=1:NOF
Img_I=read(obj,i); %读取视频
imwrite(Img_I,[directory,[num2str(i) '.jpg'];]); %每一帧输出一张jpg
end;
视频变成一帧一帧的图片,第一步运行:read_frame
obj = VideoReader('D:\fly.avi');%输入视频位置,自行根据视频位置修改D:\fly.avi
绝对帧差法镜头分割
%绝对帧间差法:比较相邻图像帧像素的亮度和之差,当大于某个阈值时,则判定发生突变。
NOF=1538; %图片数量,注意手动修改
file_path = 'D:\Documents\MATLAB\lutao\images\';% 图像文件夹路径
img_path_list = dir(strcat(file_path,'*.jpg'));%获取该文件夹中所有jpg格式的图像
for i=1:NOF-1
image_name_i = strcat(num2str(i),'.jpg'); %图像名
img_i = imread(strcat(file_path,image_name_i)); %读取该图像
image_name_i_plus = strcat(num2str(i+1),'.jpg');% 后一张图像名
img_i_plus = imread(strcat(file_path,image_name_i_plus)); %读取后一张图像
img_diff(i)=norm(double(img_i(:,:,1)-img_i_plus(:,:,1)))+norm(double(img_i(:,:,2)-img_i_plus(:,:,2)))+norm(double(img_i(:,:,3)-img_i_plus(:,:,3))); %计算前后两张图像的帧像素的亮度和之差
end;
Threshold=mean(img_diff)*4; %阈值设定为平均像素差的4倍
for i=2:NOF-2
if(img_diff(i)>img_diff(i-1)&&img_diff(i)>img_diff(i+1)&&img_diff(i)>Threshold) %如果该图像的像素差大于前后两张以及阈值,则判定为镜头切换的帧编号
fprintf('%d\n',i); %输出帧编号
end;
end;
第一种方法:绝对帧差法,运行jueduizhencha
NOF=1538; %图片数量,注意手动修改,根据第一步运行出来的帧总数NOF自行修改
file_path = 'D:\Documents\MATLAB\lutao\images\';% 图像文件夹路径,根据第一步运行出来的帧的位置自己修改
运行结果会显示出来,镜头切换的帧是哪一帧
我感觉对于突变严重的视频检测比较准确,总体来说不是很准确
感知哈希法
%感知哈希法:感知哈希法是用于相似图片搜索的一种快速算法。
NOF=1538; %图像数量
file_path = 'D:\Documents\MATLAB\lutao\images\';% 图像文件夹路径
img_path_list = dir(strcat(file_path,'*.jpg'));%获取该文件夹中所有jpg格式的图像
Threshold=2; %阈值设定为2
count=zeros(NOF-1,1); %用于记录与后一张图像有多少位是不同的
for i=1:NOF-1
image_name_i = strcat(num2str(i),'.jpg'); %图像名
img_i = imread(strcat(file_path,image_name_i)); %读取该图像
image_name_i_plus = strcat(num2str(i+1),'.jpg');% 后一张图像名
img_i_plus = imread(strcat(file_path,image_name_i_plus)); %读取后一张图像
imbw_i=im2bw(rgb2gray(imresize(img_i,[8,8]))); %将图像转化为64个像素以及64级灰度
imbw_i_plus=im2bw(rgb2gray(imresize(img_i_plus,[8,8]))); %将后一张图像转化为64个像素以及64级灰度
for j=1:8
for k=1:8
if(imbw_i(j,k)~=imbw_i_plus(j,k))
count(i)=count(i)+1; %计算与后一张图像有多少位是不同的
end;
end;
end;
end;
for i=1:NOF-1
if(count(i)>Threshold) %如果count大于阈值,说明与后一张图像差别很大,则判定为镜头切换的帧编号
fprintf('%d\n',i); %输出帧编号
end;
end;
第二种感知哈希法:第一步仍然是运行read_frame,然后运行ganzhihaxi
运行结果会显示出来,镜头切换的帧是哪一帧
比较准确,会有误检
图片相关系数法:
%图片相关系数法:定义两幅图像的相关系数来衡量相邻图像帧的相似性。
NOF=829; %图像数量
file_path = 'D:\Documents\MATLAB\lutao\images\';% 图像文件夹路径
img_path_list = dir(strcat(file_path,'*.jpg'));%获取该文件夹中所有jpg格式的图像
for i=1:NOF-1
image_name_i = strcat(num2str(i),'.jpg'); %图像名
img_i = imread(strcat(file_path,image_name_i)); %读取该图像
image_name_i_plus = strcat(num2str(i+1),'.jpg');% 后一张图像名
img_i_plus = imread(strcat(file_path,image_name_i_plus)); %读取后一张图像
img_sim(i)=corr2(img_i(:,:,1),img_i_plus(:,:,1))+corr2(img_i(:,:,2),img_i_plus(:,:,2))+corr2(img_i(:,:,3),img_i_plus(:,:,3)); %计算前后两张图像的相似度
img_sim(i)=img_sim(i)/3;
end;
Threshold=0.8; %相似度阈值
for i=1:length(img_sim)
if(img_sim(i)
图片相关系数法:第一步仍然是运行read_frame,然后运行picture_xiangguanxishu
这三种方法里面最准确的一种方法