liqingcheng11 2021-04-27 22:28 采纳率: 0%
浏览 32

pycharm的视频播放功能和评估算法的关联

这是我的main.py文件,是视频评估功能的界面,里面有视频播放功能、评估视频功能以及一些按钮和界面基本的标题

import numpy as np
import tkinter as tk
import os
import skvideo.io
from PIL import Image, ImageTk
from cv2 import cv2
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from tkinter import filedialog
from torchvision import transforms
from VSFA import VSFA
from CNNfeatures import get_features
from pylab import *
import torch
from torchvision import transforms
import skvideo.io
from PIL import Image
import numpy as np
from VSFA import VSFA
from CNNfeatures import get_features
from argparse import ArgumentParser
import time
import torch, gc
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import tkinter as tk
from pylab import *
from demo import comp

matplotlib.use('TkAgg')


# 打开视频
def open_file():
    videoPath = filedialog.askopenfilename()
    video = cv2.VideoCapture(videoPath)
    waitTime = 1000 / video.get(5)
    videoTime = video.get(7) / video.get(5)
    while video.isOpened():
        ret, readyFrame = video.read()
        if ret == True:
            videoFrame = cv2.cvtColor(readyFrame, cv2.COLOR_BGR2RGBA)
            newImage = Image.fromarray(videoFrame).resize((520, 320))
            newCover = ImageTk.PhotoImage(image=newImage)
            videoLable.configure(image=newCover)
            videoLable.image = newCover
            videoLable.update()
            cv2.waitKey(int(waitTime))
        else:
            break




window = tk.Tk()
window.title('视频质量评估系统')
window.geometry('1080x720')
# 设置视频位置
videoLable = tk.Label(window, width=520, height=320, bd=0)
videoLable.place(x=50, y=200)
# 题目文字
l1 = tk.Label(window, text='视频质量评估系统', bg='white', font=('Arial', 20), width=15, height=2)
l1.place(x=400, y=50)
# 按钮设置
b1 = tk.Button(window, text='打开视频', width=15, height=2, command=open_file)
b1.place(x=200, y=620)

def get_comp():
    x, y, z = comp()
    c1 = tk.Label(window, text=x, font=('imei', 20), fg='blue', width=50, height=2)

    c1.place(x=820, y=420)

    c2 = tk.Label(window, text=y, font=('imei', 20, 'italic'), fg='green', width=50, height=2)

    c2.place(x=820, y=520)

    c3 = tk.Label(window, text=z, font=('imei', 20, 'underline'), fg='red', width=50, height=2)

    c3.place(x=820, y=620)


b2 = tk.Button(window, text='测试数据', width=15, height=2, command=get_comp)

b2.place(x=400, y=620)
window.mainloop()

demo.py文件里面放的是评估算法,输出结果有3个,分别是视频长度、视频质量、以及算法运行时间。

import torch
from torchvision import transforms
import skvideo.io
from PIL import Image
import numpy as np
from VSFA import VSFA
from CNNfeatures import get_features
from argparse import ArgumentParser
import time
import torch, gc
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import tkinter as tk
from pylab import *
import os

gc.collect()
torch.cuda.empty_cache
# if torch.cuda.device_count() > 1:
#     model = torch.nn.DataParallel(model, device_ids=[1,2,3,4,5,6,7,8])

import time


def comp():
    parser = ArgumentParser(description='"Test Demo of VSFA')
    parser.add_argument('--model_path', default='models/VSFA-KoNViD-1k-EXP2', type=str,
                        help='model path (default: models/VSFA-KoNViD-1k-EXP2)')
    parser.add_argument('--video_path', default='./test.mp4', type=str,
                        help='video path (default: ./test.mp4)')
    parser.add_argument('--video_format', default='RGB', type=str,
                        help='video format: RGB or YUV420 (default: RGB)')
    parser.add_argument('--video_width', type=int, default=None,
                        help='video width')
    parser.add_argument('--video_height', type=int, default=None,
                        help='video height')

    parser.add_argument('--frame_batch_size', type=int, default=32,
                        help='frame batch size for feature extraction (default: 32)')
    args = parser.parse_args(args=[])

    device = torch.device("cpu")
    start = time.time()
    # data preparation
    assert args.video_format == 'YUV420' or args.video_format == 'RGB'
    if args.video_format == 'YUV420':
        video_data = skvideo.io.vread(args.video_path, args.video_height, args.video_width,
                                      inputdict={'-pix_fmt': 'yuvj420p'})
    else:
        video_data = skvideo.io.vread(args.video_path)

    video_length = video_data.shape[0]
    video_channel = video_data.shape[3]
    video_height = video_data.shape[1]
    video_width = video_data.shape[2]
    transformed_video = torch.zeros([video_length, video_channel, video_height, video_width])
    transform = transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
    ])

    for frame_idx in range(video_length):
        frame = video_data[frame_idx]
        frame = Image.fromarray(frame)
        frame = transform(frame)
        transformed_video[frame_idx] = frame
    # print(frame_idx)
    x = f"Video length:{transformed_video.shape[0]}"

    # feature extraction
    features = get_features(transformed_video, frame_batch_size=args.frame_batch_size, device=device)
    features = torch.unsqueeze(features, 0)  # batch size 1

    # quality prediction using VSFA
    model = VSFA()
    model.load_state_dict(torch.load(args.model_path))  #
    model.to(device)
    model.eval()
    with torch.no_grad():
        input_length = features.shape[1] * torch.ones(1, 1)
        outputs = model(features, input_length)
        y_pred = outputs[0][0].to('cpu').numpy()

    y = f"Predicted quality:{y_pred}"
    end = time.time()
    z = f"time:{end - start}"
    return x, y, z

# window = tk.Tk()
# # 设置曲线图
# f = Figure(figsize=(8,8), dpi=50)
# a = f.add_subplot(111)
# x = format(end-start)
# y = format(y_pred)
# a.plot(x,y)
# #把绘制的图形显示到tkinter窗口上
# canvas =FigureCanvasTkAgg(f, master=window)
# canvas.draw()
# canvas.get_tk_widget().place(x=620,y=180)
# window.mainloop()

现在的问题是评估时如果想换别的视频进行评估,只能在demo里手动更换视频文件名,现在想在界面的打开视频功能里就能自动更换视频。

注:视频文件名是test.mp4

 

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-07 17:07
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥30 vmware exsi重置后的密码
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?
  • ¥15 电磁场的matlab仿真
  • ¥15 mars2d在vue3中的引入问题
  • ¥50 h5唤醒支付宝并跳转至向小荷包转账界面