【python学习笔记——工具视频帧率计算器】

视频帧率计算器,可以计算视频的帧率、帧数、时间长度,
还可以播放视频,计算视频清晰度,计算最清晰帧,保存最清晰帧。
其中计算视频清晰度的方法有三种,分别是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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值