• opencv+tkinter来在GUI内读取视频或摄像头


    在TK中读取视频,主要是使用tkinter中的tkinter.after这个函数,相当于一个定时器。
    当然使用threading多线程也是能够达到同样的效果

    video=cv2.VideoCapture(0)
    def imshow():
        global video
        global root
        global image
        res,img=video.read()
    
        if res==True:
            #将adarray转化为image
            img = Image.fromarray(img)
            #显示图片到label
            img = ImageTk.PhotoImage(img)
            image.image=img
            image['image']=img
        #创建一个定时器,每10ms进入一次函数
        root.after(10,imshow)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这个函数内加上root.after相当于一个定时器每10ms进入这个函数一次,这样达到不断读取video视频的值,然后将opencv读取的ndarray类型改变为image类型再在组件中显示就行,好处是有opencv的加持可以在每次都进行图像处理。
    如果需要读取视频只需要把video=cv2.VideoCapture(0)
    更改为:

    video=cv2.VideoCapture(video_path)
    #video_path就是视频的地址
    
    • 1
    • 2

    然后看完整代码:

    import cv2
    from PIL import Image,ImageTk
    import tkinter
    
    
    #创建一个TK界面
    root = tkinter.Tk()
    root.geometry("640x480")
    root.resizable(False, False)
    root.title('video')
    
    video=cv2.VideoCapture(0)
    
    
    def imshow():
        global video
        global root
        global image
        res,img=video.read()
    
        if res==True:
            #将adarray转化为image
            img = Image.fromarray(img)
            #显示图片到label
            img = ImageTk.PhotoImage(img)
            image.image=img
            image['image']=img
        #创建一个定时器,每10ms进入一次函数
        root.after(10,imshow)
    
    #创建label标签
    image = tkinter.Label(root, text=' ', width=640, height=480)
    image.place(x=0, y=0, width=640, height=480)
    
    imshow()
    
    root.mainloop()
    
    #释放video资源
    video.release()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    运行效果:
    在这里插入图片描述
    附上多线程的方法:

    import cv2
    import numpy as np
    from PIL import Image,ImageTk
    import tkinter
    import threading
    
    #创建一个TK界面
    root = tkinter.Tk()
    root.geometry("640x480")
    root.resizable(False, False)
    root.title('video')
    video=cv2.VideoCapture(0,cv2.CAP_DSHOW)
    
    def imshow():
        global video
        global image
        while True:
            res,img=video.read()
            if np.any(img):
                #将adarray转化为image
                img = Image.fromarray(img)
                #显示图片到label
                newimg = ImageTk.PhotoImage(img)
                image.image=newimg
                image['image']=newimg
    
    
    #创建一个线程
    t1=threading.Thread(target=imshow)
    #设置线程为守护线程
    t1.daemon=True
    
    #创建label标签
    image = tkinter.Label(root, text='', width=640, height=480)
    image.place(x=0, y=0, width=640, height=480)
    
    #开启线程
    t1.start()
    
    root.mainloop()
    
    
    video.release()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
  • 相关阅读:
    【CSS动效实战(纯CSS与JS动效)】03 精美手风琴侧边栏完整示例教程 示例1
    智源林咏华:大模型的竞争,差距核心在数据 | AGI 技术 50 人
    postgresql
    Gorsonpy的计算器
    vue3 canvas验证码和滑块拼图验证
    SPDK/NVMe存储技术分析之SSD设备的发现(二)
    【Vue基本功】权限路由(1)
    分公司电脑访问总部服务器突然不通了走的是SSL隧道,如何排查处理?
    [AUTOSAR][诊断管理][$11] 复位服务
    CSS常见选择器
  • 原文地址:https://blog.csdn.net/darlingqx/article/details/128160068