视频帧率计算器,可以计算视频的帧率、帧数、时间长度,
还可以播放视频,计算视频清晰度,计算最清晰帧,保存最清晰帧。
其中计算视频清晰度的方法有三种,分别是Laplacian算子、Sobel算子和平均梯度。
- 一、Laplacce算子
是一种各向同性算子,二阶微分算子,在只关心边缘的位置而不考虑其周围的象素灰度差值时比较合适。Laplace算子对孤立象素的响应要比对边缘或线的响应要更强烈
Laplacian 梯度函数
利用Laplacian算子对图像进行模板卷积得到图像的高频分量,然后可以对图像的高频分量求和,用高频分量和作为图像的清晰度评价标准。
对于一个M×N像素的图像,每个像素的亮度为g(x,y),进行滤波模板卷积后每个像素点值为z(x,y)。则图像清晰度评价函数:
Laplacian算子:z(x,y)=g(x-1,y)+g(x+1,y)+g(x,y-1)+g(x,y+1)一4g(x,y)
梯度算子为水平方向和垂直方向两个,高通滤波算子只有一个
二、Sobel算子
判断图像清晰度本质是梯度运算。 索贝尔算子(Sobeloperator)主要用于获得数字图像的一阶梯度,常见的应用和物理意义是边缘检测。 在技术上,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值,主要用于获得数字图像的一阶梯度
三、平均梯度
平均梯度(meangradient):指图像的边界或影线两侧附近灰度有明显差异,即灰度变化率大,这种变化率的大小可用来表示图像清晰度。它反映了图像微小细节反差变化的速率,即图像多维方向上密度变化的速率,表征图像的相对清晰程度。
界面如下:
"""
# -*- coding: utf-8 -*-
Created on 03 27 15:45:00 2023
@Author: yuxi
视频帧率计算器,可以计算视频的帧率、帧数、时间长度,
还可以播放视频,计算视频清晰度,计算最清晰帧,保存最清晰帧。
其中计算视频清晰度的方法有三种,分别是Laplacian算子、Sobel算子和平均梯度。
Attempt Change
"""
import cv2
import tkinter as tk
from tkinter import filedialog
import numpy as np
class FrameRateCalculator:
def __init__(self, master):
self.master = master
master.title("Frame Rate Calculator")
master.geometry("800x600")
self.label = tk.Label(master, text="选择视频文件路径:", font=("Arial", 14))
self.label.pack(pady=10)
self.entry = tk.Entry(master, font=("Arial", 14))
self.entry.pack(pady=10)
self.button = tk.Button(master, text="选择视频文件", font=("Arial", 14), command=self.browse_file)
self.button.pack(pady=10)
self.result_label = tk.Label(master, text="", font=("Arial", 14))
self.result_label.pack(pady=10)
self.calculate_button = tk.Button(master, text="计算", font=("Arial", 14), command=self.calculate)
self.calculate_button.pack(pady=10)
self.play_button = tk.Button(master, text="播放视频", font=("Arial", 14), command=self.play_video)
self.play_button.pack(pady=10)
self.clarity_button = tk.Button(master, text="计算最清晰帧", font=("Arial", 14), command=self.calculate_clarity)
self.clarity_button.pack(pady=10)
self.max_clarity_label = tk.Label(master, text="", font=("Arial", 14))
self.max_clarity_label.pack(pady=10)
self.max_clarity_frame_label = tk.Label(master, text="", font=("Arial", 14))
self.max_clarity_frame_label.pack(pady=10)
self.save_button = tk.Button(master, text="保存最清晰帧", font=("Arial", 14), command=self.save_max_clarity_frame)
self.save_button.pack(pady=10)
# 将所有按钮和标签的背景颜色、前景颜色和字体设置为红色、白色和Arial 14
# self.button.config(bg='red', fg='white', font=("Arial", 14))
# self.calculate_button.config(bg='red', fg='white', font=("Arial", 14))
# self.play_button.config(bg='red', fg='white', font=("Arial", 14))
# self.clarity_button.config(bg='red', fg='white', font=("Arial", 14))
# self.save_button.config(bg='red', fg='white', font=("Arial", 14))
# self.label.config(bg='red', fg='white', font=("Arial", 14))
# self.entry.config(bg='red', fg='white', font=("Arial", 14))
# self.result_label.config(bg='red', fg='white', font=("Arial", 14))
# self.max_clarity_label.config(bg='red', fg='white', font=("Arial", 14))
# self.max_clarity_frame_label.config(bg='red', fg='white', font=("Arial", 14))
self.master.mainloop()
def browse_file(self):
file_path = filedialog.askopenfilename()
self.entry.delete(0, tk.END)
self.entry.insert(0, file_path)
def calculate(self):
video_path = self.entry.get()
cap = cv2.VideoCapture(video_path)
fps = cap.get(cv2.CAP_PROP_FPS)
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
duration = frame_count / fps
self.result_label.config(text="帧率: {:.2f} 帧数: {} 时间长度: {:.2f}秒".format(fps, frame_count, duration), font=("Arial", 14))
def play_video(self):
video_path = self.entry.get()
cap = cv2.VideoCapture(video_path)
cv2.namedWindow('frame', cv2.WINDOW_NORMAL)
cv2.resizeWindow('frame', 800, 500)
while(cap.isOpened()):
ret, frame = cap.read()
if ret == True:
cv2.imshow('frame',frame)
if cv2.waitKey(25) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
# 计算视频清晰度
def calculate_clarity(self):
video_path = self.entry.get() # 获取视频路径
cap = cv2.VideoCapture(video_path) # 打开视频
max_clarity = 0 # 初始化最大清晰度
max_frame = None # 初始化最清晰帧
max_frame_num = 0 # 初始化最清晰帧的帧数
while(cap.isOpened()): # 循环读取视频帧
ret, frame = cap.read() # 读取视频帧
if ret == True:
#clarity = cv2.Laplacian(frame, cv2.CV_64F).var() # 计算帧的清晰度
# 计算帧的清晰度
'''sobelx = cv2.Sobel(frame, cv2.CV_64F, 1, 0, ksize=5)
sobely = cv2.Sobel(frame, cv2.CV_64F, 0, 1, ksize=5)
sobel = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
clarity = sobel.var()
'''
# 计算帧的清晰度
sobelx = cv2.Sobel(frame, cv2.CV_64F, 1, 0, ksize=3)
sobely = cv2.Sobel(frame, cv2.CV_64F, 0, 1, ksize=3)
mean_gradient = np.mean(np.sqrt(sobelx**2 + sobely**2))
clarity = mean_gradient
if clarity > max_clarity: # 如果当前帧的清晰度大于最大清晰度
max_clarity = clarity # 更新最大清晰度
max_frame = frame # 更新最清晰帧
max_frame_num = int(cap.get(cv2.CAP_PROP_POS_FRAMES)) # 更新最清晰帧的帧数
else:
break
cap.release() # 释放视频
self.max_clarity_label.config(text="最清晰帧的清晰度: {:.2f}".format(max_clarity), font=("Arial", 14))
self.max_clarity_frame_label.config(text="最清晰帧的信息: 帧数{}".format(max_frame_num), font=("Arial", 14))
self.max_frame = max_frame
def save_max_clarity_frame(self):
file_path = filedialog.asksaveasfilename(defaultextension=".jpg", filetypes=[("JPEG Image", "*.jpg"), ("PNG Image", "*.png"), ("BMP Image", "*.bmp"),("TIF Image", "*.tif")])
if file_path:
cv2.imwrite(file_path, self.max_frame)
FrameRateCalculator(tk.Tk())
视频帧率计算器exe文件:https://download.csdn.net/download/YUelite/87617813