Flask+视频关键帧提取——媒体大数据实例分析

阅读: 评论:0

Flask+视频关键帧提取——媒体大数据实例分析

Flask+视频关键帧提取——媒体大数据实例分析

文章目录

  • 前言
    • 1.编写目的
    • 2.实验环境
    • 3.实现内容
  • 一、基础代码
    • 1. 视频帧分割、保存
    • 2. 图片相似度计算
      • 2-0.基于相等判断图像是否相同
      • 2-0.基于numpy计算图像是否相似
      • 2-1. 均值哈希算法
      • 2-2. 差值哈希算法
      • 2-3. 感知哈希算法
      • 2-4. 三通道直方图算法
    • 3. 其他参考代码
      • 3-1.在POST请求后重定向到新页面 [代码参考](/)
      • 3-2.flask路由之间变量传递 [代码参考]()
      • 3-3.input-file按钮美化 [代码参考](.html)
  • 二、项目结构
  • 三、完整代码
    • ①start.html:
    • ②middle.html:
    • ③result.html:
    • ④image_process.py
    • ⑤run_frame.py:(运行这一个就行)
  • 四、实现效果

前言

1.编写目的

一方面是分享思路(啥都搜不到真的好痛苦)
另一方面是记录一下,方便自己以后查(感谢提供资料的师哥师姐们和老师)

2.实验环境

操作系统:Win10
IDE:PyCharm 2021.3 (Community Edition)
Python:3.8

3.实现内容

获取用户上传的视频,逐帧分析视频,分别使用均值哈希算法(ahash)、差值哈希算法(dhash)、感知哈希算法(phash)、三通道直方图算法(classify_hist_with_split)计算相邻帧的图片相似度,通过与阈值相比较提取视频分镜头关键帧,并通过flask将结果展示在网页上。

一、基础代码

1. 视频帧分割、保存

import cv2video_path="static/video/ghz.mp4"
image_save="per_frame/"cap=cv2.VideoCapture(video_path) #  VideoCapture()中参数是0表示打开笔记本的内置摄像头;参数是视频文件路径则打开
video_frame_(cv2.CAP_PROP_FRAME_COUNT) # 视频帧数for i in range(int(video_frame_count)):# 按帧读取视频ret,ad() # ad()按帧读取视频;ret为True 或者False代表有没有读取到图片;frame就是每一帧的图像,是个三维矩阵。# 图片转灰度frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) # 使用opencv中cv2.cvtColor()函数来改变图像的颜色空间# 保存cv2.imwrite('per_frame/image{}.jpg'.format(i),frame)

2. 图片相似度计算

2-0.基于相等判断图像是否相同


import operator
from PIL import Image
import os
os.chdir('e:mediabigdata')a=Image.open('./img/image0.jpg')
b=Image.open('./img/image0.jpg')out=operator.eq(a,b)
print(out)

2-0.基于numpy计算图像是否相似

import numpy as np
from PIL import Imageimport os
os.chdir('e:mediabigdata')a=Image.open('./img/image0.jpg')
b=Image.open('./img/image0.jpg')diff=np.subtract(a,b)
out=not np.any(diff)
print(out)

2-1. 均值哈希算法

aHash速度较快,但精确度较低;pHash则反其道而行之,精确度较高但速度较慢;dHash兼顾二者,精确度较高且速度较快。

1.均值哈希和差值哈希算法的时间都比感知哈希少,因为感知哈希resize为32*32,并且要进行DCT离散余弦变换,这个计算比较耗时
2.改变图片的亮度,色度,对比度,锐度,均值哈希的效果都是最好的,几乎不受影响,其次是差值哈希,最差是感知哈希
3.但是感知哈希在图片旋转以及resize后,效果比前两者要好

步骤:

  1. 图片缩放,一般为88,或者3232(为了保留图像的结构,降低图像的信息量,需要去掉细节、大小和横纵比的差异,建议把图片统一缩放到8*8,共64个像素的图片)
  2. 将图片灰度化
  3. 求平均值,并根据平均值将每一个像素二值化(遍历灰度图片每一个像素,如果大于平均值记录为1,否则为0)
  4. 将8*8=64位bit,每8个比特为一个十六进制值,转换成字符串,生成哈希值(指纹)


①获取hash值:

# 均值哈希算法
def aHash(img):# 缩放为8*8img = size(img, (8, 8))# 转换为灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# s为像素和初值为0,hash_str为hash值初值为''s = 0hash_str = ''# 遍历累加求像素和for i in range(8):for j in range(8):s = s + gray[i, j]# 求平均灰度avg = s / 64# 灰度大于平均值为1相反为0生成图片的hash值for i in range(8):for j in range(8):if gray[i, j] > avg:hash_str = hash_str + '1'else:hash_str = hash_str + '0'return hash_str

②计算汉明距离:
生成每一个图片的哈希值后,需要计算哈希值的距离,来判断两张图片的相似度。一般使用汉明距离,也就是逐位计算两张图片的哈希值是否相同。
算法中1和0顺序组合起来的即是图片的指纹hash。顺序不固定,但是比较的时候必须是相同的顺序。
对比两幅图的指纹,计算汉明距离,即两个64位的hash值有多少是不一样的,不同的位数越小,图片越相似
汉明距离:一组二进制数据变成另一组数据所需要的步骤,可以衡量两图的差异,汉明距离越小,则相似度越高。汉明距离为0,即两张图片完全一样

# Hash值对比,计算汉明距离
def cmpHash(hash1, hash2):n = 0# hash长度不同,则返回-1代表传参出错if len(hash1) != len(hash2):return -1# 遍历判断for i in range(len(hash1)):# 不相等则n计数+1,n最终为相似度if hash1[i] != hash2[i]:n = n + 1return n # 返回汉明距离

③使用汉明距离量化两张图像的相似性:

## 方法1:调用均值哈希算法,得到哈希值,计算汉明距离hash1 = aHash(frame0)hash2 = aHash(frame1)n1 = cmpHash(hash1, hash2) # 汉明距离s = 1 - float(n1 / 64) # 得到一个不大于1的数值,值越大图片相似度越高

2-2. 差值哈希算法

相比pHash,dHash的速度更快,相比aHash,dHash在效率几乎相同的情况下的效果要更好,它是基于渐变实现的。
步骤:

  1. 图片缩放为9*8大小
  2. 将图片灰度化
  3. 差异值计算(计算相邻像素间的差异值,这样每行9个像素之间产生了8个不同的差异,一共8行,则产生了64个差异值;前一个像素大于后一个像素则为1,否则为0)
  4. 生成哈希值

①获取hash值:

# 差值哈希算法
def dHash(img):# 缩放9*8img = size(img, (9, 8))# 转换灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)hash_str = ''# 每行前一个像素大于后一个像素为1,相反为0,生成哈希for i in range(8):for j in range(8):if gray[i, j] > gray[i, j + 1]:hash_str = hash_str + '1'else:hash_str = hash_str + '0'return hash_str

②使用汉明距离量化两张图像的相似性:

## 方法2:调用差值哈希算法,得到哈希值,计算汉明距离hash1 = dHash(frame0)hash2 = dHash(frame1)n2 = cmpHash(hash1, hash2)s = 1 - float(n2 / 64)

2-3. 感知哈希算法

感知哈希算法可以获得更精确的结果,它采用的是DCT(离散余弦变换)来降低频率。

  1. 图片缩放 为32*32大小
  2. 将图片灰度化
  3. 对图片进行离散余弦变换(DCT),转换的频域
  4. 取频域左上角8*8大小(图片的能量都集中在低频部分,低频位于左上角)
  5. 计算平均值,并根据平均值二值化(同平均哈希)
  6. 生成哈希值

DCT变换的全称是离散余弦变换(Discrete Cosine Transform),主要用于将数据或图像的压缩,能够将空域的信号转换到频域上,具有良好的去相关性的性能。DCT变换本身是无损的,但是在图像编码等领域给接下来的量化、哈弗曼编码等创造了很好的条件,同时,由于DCT变换时对称的,所以,我们可以在量化编码后利用DCT反变换,在接收端恢复原始的图像信息。对原始图像进行离散余弦变换,变换后DCT系数能量主要集中在左上角,其余大部分系数接近于零,DCT具有适用于图像压缩的特性。将变换后的DCT系数进行门限操作,将小于一定值得系数归零,这就是图像压缩中的量化过程,然后进行逆DCT运算,可以得到压缩后的图像。
①获取hash值:

# 感知哈希算法
def pHash(img):# 缩放32*32img = size(img, (32, 32))  # , interpolation=cv2.INTER_CUBIC # 指定图像缩放之后,重新计算像素的方式,默认是INTER_LINEAR# 转换为灰度图gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 将灰度图转为浮点型,再进行dct变换dct = cv2.dct(np.float32(gray)) # 计算DCT: DCT把图片分离成分率的集合;dct输入必须为单通道浮点型# opencv实现的掩码操作dct_roi = dct[0:8, 0:8] # DCT计算后的矩阵是32 * 32,保留左上角的8 * 8,这些代表的图片的最低频率hash = []avreage = np.mean(dct_roi) # 求均值,返回一个实数for i in range(dct_roi.shape[0]):for j in range(dct_roi.shape[1]):if dct_roi[i, j] > avreage:hash.append(1)else:hash.append(0)return hash

②使用汉明距离量化两张图像的相似性:

## 方法3:调用感知哈希算法,得到哈希值,计算汉明距离hash1 = pHash(frame0)hash2 = pHash(frame1)n3 = cmpHash(hash1, hash2)s = 1 - float(n3 / 64)

2-4. 三通道直方图算法

辅助理解
简单的理解:图像像素的统计分布,即像素值(0-255)之间的像素值,在一幅图像上的统计结果就是直方图。
①计算单通道:

# 灰度直方图算法
def calculate(image1, image2):# 计算单通道的直方图的相似值hist1 = cv2.calcHist([image1], [0], None, [256], [0.0, 255.0]) # 统计图像的像素直方图hist2 = cv2.calcHist([image2], [0], None, [256], [0.0, 255.0])# 计算直方图的重合度degree = 0for i in range(len(hist1)):if hist1[i] != hist2[i]:degree = degree + (1 - abs(his

本文发布于:2024-01-31 18:10:46,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170669584630402.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:实例   关键   媒体   数据   视频
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23