【问题标题】:Trying to close the camera with a button using opencv and tkinter尝试使用 opencv 和 tkinter 使用按钮关闭相机
【发布时间】:2021-10-28 00:53:55
【问题描述】:

我有它,所以相机链接到第一个按钮,当你点击它时,它应该打开相机。我还尝试创建另一个按钮,当您单击该按钮时,它将关闭相机。这应该如何工作?我正在使用 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()

【问题讨论】:

    标签: python opencv tkinter


    【解决方案1】:

    您可以使用标志。当您希望相机启动时将标志设置为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()
    

    【讨论】:

    • 我注意到当我停止相机时,它只是冻结了最后一张当前图像。有没有办法让我喜欢在它上面放一个黑屏?
    • @PandaMan456_ 是的,如果您只是想删除图像,请在cap.release() 之后使用vid_lbl.config(image="")。否则,如果您想要黑屏,请创建黑色图像并使用相同的图像。
    • 我注意到,当我单击开始按钮时,实际相机开始之前大约有 10 秒的延迟。有什么办法可以减少时间?
    • @PandaMan456_ 您可能想尝试在另一个线程中启动它。顺便说一句,这种延迟并不重要,您会想要启动另一个线程。
    • @Art 在cap = None 后面加上stop_vid 也不错。
    猜你喜欢
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 2014-04-07
    • 2023-02-04
    • 1970-01-01
    相关资源
    最近更新 更多