尝试使用 opencv 和 tkinter 用按钮关闭相机

Trying to close the camera with a button using opencv and tkinter

我有它,所以相机链接到第一个按钮,当你点击它时,它应该打开相机。我还试图创建另一个按钮,当您单击该按钮时,它将关闭相机。那应该如何工作?我正在使用 opencv、tkinter 和 PIL。

这是我的代码

import cv2
import numpy as np
from time import sleep
from tkinter import *
from PIL import Image
from PIL import ImageTk


white       = "#ffffff"
lightBlue2  = "#adc5ed"
font        = "Constantia"
WIDTH       = 1920
HEIGHT      = 1080
fontButtons = (font, 12)
maxWidth    = 1000
maxHeight   = 600
mainWindow = Tk()
mainWindow.title('RocketShip')
mainWindow.configure(width = WIDTH, height = HEIGHT, bg="black")
mainFrame = Frame(mainWindow, height = 640, width = 810)
mainFrame.place(x=350,y=0)
cameraFrame = Frame(mainWindow, height = 640, width = 405)
cameraFrame.place(x = 0, y = 0)
lmain = Label(mainFrame)

cap = cv2.VideoCapture(0)    

def show_frame():
    lmain = Label(mainFrame)
    ret, frame = cap.read()    
    cv2image   = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)    
    img   = Image.fromarray(cv2image).resize((810,640))
    imgtk = ImageTk.PhotoImage(image=img)    
    lmain.grid(row=0, column=0)    

    lmain.grid(row=0, column=0)    
    lmain.imgtk = imgtk    
    lmain.configure(image=imgtk)    
    lmain.after(10, show_frame)







#Buttons
TurnCameraOn = Button(cameraFrame, width = 405, height = 25, bg = "blue", command = show_frame)
TurnCameraOn.place(x = 0, y = 0)
TurnCameraOff = Button(cameraFrame, width = 405, height = 25, bg = "blue")
TurnCameraOff.place(x = 0, y = 300)

#file menu    
menubar = Menu(mainWindow)    
file = Menu(menubar, tearoff = 0)    
menubar.add_cascade(label ='Commands', menu = file)    
file.add_command(label ='Open Camera', command = show_frame)     
file.add_separator()    
file.add_command(label ='Exit', command = lambda:mainWindow.destroy())    
mainWindow.config(menu = menubar)    
mainWindow.mainloop()

您可以使用旗帜。当你想要相机启动时将标志设置为True,当你想要停止循环时将其设置为False,然后使用VideoCapture.release()关闭捕获设备。

这是一个例子

import cv2
from tkinter import *
from PIL import Image, ImageTk


cam_on = False
cap = None
mainWindow = Tk()


mainFrame = Frame(mainWindow, height = 640, width = 810)
mainFrame.place(x=350,y=0)

cameraFrame = Frame(mainWindow, height = 640, width = 405)
cameraFrame.place(x = 0, y = 0)
   

def show_frame():

    if cam_on:

        ret, frame = cap.read()    

        if ret:
            cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)    
            img = Image.fromarray(cv2image).resize((810,640))
            imgtk = ImageTk.PhotoImage(image=img)        
            vid_lbl.imgtk = imgtk    
            vid_lbl.configure(image=imgtk)    
        
        vid_lbl.after(10, show_frame)

def start_vid():
    global cam_on, cap
    stop_vid()
    cam_on = True
    cap = cv2.VideoCapture(0) 
    show_frame()

def stop_vid():
    global cam_on
    cam_on = False
    
    if cap:
        cap.release()

vid_lbl = Label(mainFrame)
vid_lbl.grid(row=0, column=0)

#Buttons
TurnCameraOn = Button(cameraFrame, text="start Video", bg = "blue", command=start_vid)
TurnCameraOn.place(x = 0, y = 0)
TurnCameraOff = Button(cameraFrame, text="stop Video", bg = "blue", command=stop_vid)
TurnCameraOff.place(x = 0, y = 300)

mainWindow.mainloop()