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)

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

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

然后看完整代码:

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()

运行效果:
opencv+tkinter来在GUI内读取视频或摄像头_第1张图片
附上多线程的方法:

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()

你可能感兴趣的:(opencv,python,tkinter)