tkinter写一个视频截屏工具

该博客介绍了使用Python进行视频处理的方法,包括选择视频、播放视频、实时显示视频帧、截取屏幕快照并按指定帧间隔保存图片。通过Tkinter库创建GUI界面,结合OpenCV库实现视频操作。示例代码详细展示了如何创建一个简单的视频处理应用。
摘要由CSDN通过智能技术生成

效果

在这里插入图片描述

python代码

#coding=utf-8
import cv2,os
import tkinter as tk
from tkinter import filedialog
from PIL import ImageTk,Image


class Display():
    def __init__(self,wide=800, height=500,save_path="result",fps=70):
        self.W, self.H = wide, height
        self.fps=fps
        self.save_path = save_path

        self.button_w, self.button_h = 100, 30
        #button stretch
        self.button_hstretch=10
        self.button_wstretch = 10

        self.video_cap=None
        self.frame=None

        self._init_root()

    def run(self):
        self.root.mainloop()

	# Initialization window
    def _init_root(self,):
        #creat window
        self.root=tk.Tk()
        self.root.title("video shot")
        self.root.config(background="white")
        self.root.geometry(str(self.W) + "x" + str(self.H) + "-500-200")
        self.root.resizable(0, 0)
        #self.root.iconbitmap("./image/icon.ico")
        self.root.attributes("-alpha", 0.95)

        """left area"""
        # creat video area
        self.video_w, self.video_h= int(3 / 4 * self.W) - 1, int(self.H) - 2
        self.video_area = tk.Label(self.root, bg="black", fg="green", cursor="cross")
        self.video_area.place(x=1, y=1, w=self.video_w, h=self.video_h - 35)

        #state area
        self.text_area_frame = tk.Label(self.root, text="----------------")
        self.text_area_frame.place(x=1, y=self.video_h - 32, w=120, h=30)
        self.text_area_info = tk.Label(self.root, text="----------------")
        self.text_area_info.place(x=130, y=self.video_h - 32, w=self.video_w-130, h=30)

        """right area"""
        right_x, right_y = 7 / 8 * self.W - 1 / 2 * self.button_w, 3 / 11 * self.H

        #button
        tk.Button(self.root, text="选择文件", relief="groove", command=self._select_video)\
            .place(x=right_x, y= right_y-20, w=self.button_w, h=self.button_h)
        tk.Button(self.root, text="播放", relief="groove", command=self._play)\
            .place(x=right_x, y= right_y+2*self.button_h+self.button_hstretch, w=self.button_w, h=self.button_h)
        tk.Button(self.root, text=" 截屏", relief="groove", command=self._screen_shot)\
            .place(x=right_x, y= right_y+4*(self.button_h+self.button_hstretch), w=self.button_w, h=self.button_h)
        tk.Button(self.root, text="关闭", relief="groove", command=self._exit)\
            .place(x=right_x, y= right_y+6*(self.button_h+self.button_hstretch), w=self.button_w, h=self.button_h)

    # select video
    def _select_video(self):
        self.video_file=filedialog.askopenfilename()

    # play video
    def _play(self):
        self.video_cap = cv2.VideoCapture(self.video_file)
        frame_count=self.video_cap.get(cv2.CAP_PROP_FRAME_COUNT)

        video_source=self._get_frame(self.video_cap,self.fps)
        self.count=0
        for self.frame in video_source:
            img=self._convert_img(self.frame, self.video_w)
            self.video_area.config(image=img)
            self.video_area.update()

            self.text_area_frame.config(text='frame: ' + str(self.count) + " /:" + str(frame_count))
            self.text_area_frame.update()
            self.count+=1

        self.video_cap.release()

    # save frame
    def _screen_shot(self):
        os.makedirs(self.save_path, exist_ok=True)
        name = self.video_file.split(".")[0].split("/") [-1]   # os.sep is incorrect

        cv2.imwrite(os.path.join(self.save_path, name + "_" + str(self.count) + '.bmp'), self.frame)
        self.text_area_info.config(text='save frame to: ' +
                                         os.path.join(self.save_path, name + "_" + str(self.count) + '.bmp'))
        self.text_area_info.update()

    # get frame from video
    def _get_frame(self,video_cap, fps=70):
        while 1:
            ret, frame = video_cap.read()
            if cv2.waitKey(int(1000 / fps)) == 27 or not ret:   ##
                break
            yield frame

    # convert frame to tk img
    def _convert_img(self,img,video_w):
        h, w, _ = img.shape
        wc ,hc= video_w,int(h * (video_w / w))

        img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
        current_image = Image.fromarray(img, "RGB").resize((wc, hc), Image.ANTIALIAS)
        img = ImageTk.PhotoImage(image=current_image)

        return img

    def _exit(self):
        self.video_cap.release()
        exit()


if __name__=="__main__":
    ds=Display()
    ds.run()

附1.0版本,按一定帧间隔保存


def getPic(file, interval, save_path="result", fps=70):
    """
    视屏截图
    :param file:
    :param interval:按指定间隔保存
    :param save_path:
    :param fps:
    """
    os.makedirs(save_path,exist_ok=True)
    name=file.split(".")[0]

    video = cv2.VideoCapture(file)
    cv2.namedWindow(file, 0)
    count=0
    while 1:
        ret, frame = video.read()
        if cv2.waitKey(int(1000/fps)) == 27 or not ret:   # "ESC":27,“esc”退出
            break

        if count % interval == 0:
            cv2.imwrite(os.path.join(save_path ,name+"_"+ str(count//interval) + '.bmp'), frame)
            cv2.putText(frame, "cut"+str(count//interval), (123, 456),
                        cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 3)
        cv2.imshow(file, frame)

        count+=1

    video.release()
    cv2.destroyAllWindows()


if __name__=="__main__":
    getPic(file="view1.mp4", interval=50, fps=70)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值