我正在做一个项目,我必须使用秒表,同时打开相机和检测手,我已经有两个代码分别,但当我把它们放在一起,相机不工作,它保持静态,只有计时器工作,你能帮我:(
手部检测代码:
import cv2
from cvzone.HandTrackingModule import HandDetector
frame = cv2.VideoCapture(0)
#frame.set(3, 1280)
#frame.set(4, 720)
# initialize hand detector module with some confidence
handDetector = HandDetector(detectionCon=0.8)
# loop
while True:
# Read the frames from webcam
res, img = frame.read()
# detect the hands, by default it will detect two hands
hands = handDetector.findHands(img)
# show the output
cv2.imshow("Hands", img)
if cv2.waitKey(10) & 0xFF == ord('q'):
break
frame.release()
cv2.destroyAllWindows()
秒表代码:
import tkinter as tk
from datetime import datetime
class stopwatch(tk.Frame):
def __init__(self,window=None):
super().__init__(window)
self.window = window
self.new_time = ''
self.running= False
self.total_hours = 0
self.total_minutes = 0
self.total_seconds = 0
self.pack()
self.features()
def features(self):
self.stopwatch_label = tk.Label(self,text='00:00:00',background="black",foreground="white",font=('arial',85,"bold"))
self.stopwatch_label.pack()
self.start_time_button = tk.Button(self,text="START",height=5,width=7,font=('arial',19,"bold"),background="green", command=self.start_time)
self.start_time_button.pack(side=tk.LEFT)
self.stop_time_button = tk.Button(self,text="STOP",height=5,width=7,font=('arial',19,"bold"),background="red", command=self.pause_time)
self.stop_time_button.pack(side=tk.LEFT)
self.reset_time_button = tk.Button(self,text="RESET",height=5,width=7,font=('arial',19,"bold"),background="yellow",command=self.reset_time)
self.reset_time_button.pack(side=tk.LEFT)
self.quit_button =tk.Button(self,text="QUIT",height=5, width=7,font=('arial',19,"bold"),background="blue",command=self.window.quit)
self.quit_button.pack(side=tk.LEFT)
self.window.title('STOPWATCH')
def start_time(self):
if not self.running:
self.stopwatch_label.after(1000)
self.change()
self.running = True
def pause_time(self):
if self.running:
self.stopwatch_label.after_cancel(self.new_time)
self.running == False
def reset_time(self):
if self.running:
self.stop_time_button.after_cancel(self.new_time)
self.running = False
self.total_hours, self.total_minutes, self.total_seconds = 0,0,0
self.stopwatch_label.config(text="00:00:00")
def change(self):
self.total_seconds += 1
if self.total_seconds == 60:
self.total_minutes += 1
self.total_seconds = 0
if self.total_minutes == 60:
self.total_hours += 1
self.total_minutes = 0
total_hours_string = f"{self.total_hours}" if self.total_hours>9 else f'0{self.total_hours}'
total_minutes_string = f"{self.total_minutes}" if self.total_minutes>9 else f'0{self.total_minutes}'
total_seconds_string = f"{self.total_seconds}" if self.total_seconds>9 else f'0{self.total_seconds}'
self.stopwatch_label.config(text=total_hours_string + ':' + total_minutes_string+ ':' + total_seconds_string)
self.new_time = self.stopwatch_label.after(100,self.change)
root = tk.Tk()
obj = stopwatch(window = root)
obj.mainloop()
下面是我的最终代码:
import tkinter as tk
from datetime import datetime
import cv2
from cvzone.HandTrackingModule import HandDetector
frame = cv2.VideoCapture(0)
handDetector = HandDetector(detectionCon=0.8)
# Read the frames from webcam
while True:
res, img = frame.read()
hands = handDetector.findHands(img)
class stopwatch(tk.Frame):
def __init__(self,window=None):
super().__init__(window)
self.window = window
self.new_time = ''
self.running= False
self.total_hours = 0
self.total_minutes = 0
self.total_seconds = 0
self.pack()
self.features()
def features(self):
self.stopwatch_label = tk.Label(self,text='00:00:00',background="black",foreground="white",font=('arial',85,"bold"))
self.stopwatch_label.pack()
self.start_time_button = tk.Button(self,text="START",height=5,width=7,font=('arial',19,"bold"),background="green", command=self.start_time)
self.start_time_button.pack(side=tk.LEFT)
self.stop_time_button = tk.Button(self,text="STOP",height=5,width=7,font=('arial',19,"bold"),background="red", command=self.pause_time)
self.stop_time_button.pack(side=tk.LEFT)
self.reset_time_button = tk.Button(self,text="RESET",height=5,width=7,font=('arial',19,"bold"),background="yellow",command=self.reset_time)
self.reset_time_button.pack(side=tk.LEFT)
self.quit_button =tk.Button(self,text="QUIT",height=5, width=7,font=('arial',19,"bold"),background="blue",command=self.window.quit)
self.quit_button.pack(side=tk.LEFT)
self.window.title('STOPWATCH')
def start_time(self):
if not self.running:
self.stopwatch_label.after(1000)
self.change()
self.running = True
def pause_time(self):
if self.running:
self.stopwatch_label.after_cancel(self.new_time)
self.running == False
def reset_time(self):
if self.running:
self.stop_time_button.after_cancel(self.new_time)
self.running = False
self.total_hours, self.total_minutes, self.total_seconds = 0,0,0
self.stopwatch_label.config(text="00:00:00")
def change(self):
self.total_seconds += 1
if self.total_seconds == 60:
self.total_minutes += 1
self.total_seconds = 0
if self.total_minutes == 60:
self.total_hours += 1
self.total_minutes = 0
total_hours_string = f"{self.total_hours}" if self.total_hours>9 else f'0{self.total_hours}'
total_minutes_string = f"{self.total_minutes}" if self.total_minutes>9 else f'0{self.total_minutes}'
total_seconds_string = f"{self.total_seconds}" if self.total_seconds>9 else f'0{self.total_seconds}'
self.stopwatch_label.config(text=total_hours_string + ':' + total_minutes_string+ ':' + total_seconds_string)
self.new_time = self.stopwatch_label.after(100,self.change)
root = tk.Tk()
obj = stopwatch(window = root)
cv2.waitKey(1)
cv2.imshow("Hands", img)
obj.mainloop()
我已经尝试了不同的方式teh代码把它放在一起,但最后相机仍然不能很好地工作
1条答案
按热度按时间noj0wjuj1#
不建议在tkinter应用程序中运行while循环,因为它会阻止tkinter
mainloop
处理挂起的事件和更新。建议改为在线程中运行摄像头任务: