Étant donné que le jeu doit utiliser 3 caméras, le programme est une architecture multi-thread, c'est-à-dire que le thread principal ouvre trois threads de sous-caméra ; dans le thread principal (en exécutant 3 autres boucles mortes en même temps dans la boucle principale) , cet appareil photo utilise beaucoup de ressources CPU et de mémoire pour prendre des photos.Afin de réduire l'occupation du CPU, il est maintenant envisagé d'activer un certain appareil photo lorsqu'il doit être utilisé et de suspendre le fil de l'appareil photo correspondant lorsqu'il n'est pas utilisé. utilisé;
Amélioration du code objet du fil de caméra :
L'indicateur threading.Event() est utilisé pour suspendre et redémarrer le thread ; pour l'explication spécifique du code, voir le blog de référence ci-dessus.
import cv2
import threading
import time
class Camera:
def __init__(self, src=0, shape=[640, 480]):
self.__flag = threading.Event()
self.__flag.set() # 设置为True
# 用于停止线程的标识
self.__running = threading.Event()
self.__running.set() # 将running设置为True
self.src = src
self.stream = cv2.VideoCapture(src)
# self.stream.release()
if self.stream.isOpened():
self.stream.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
self.stream.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
else:
self.stream = cv2.VideoCapture(self.src + 1)
self.stream.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
self.stream.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
# self.stream.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter::fourcc('M', 'J', 'P', 'G'));
# self.stream.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('Y', 'U', 'Y', 'V'));
self.stopped = False
for _ in range(20): # warm up the camera
(self.grabbed, self.frame) = self.stream.read()
def start(self):
threading.Thread(target=self.update, args=()).start()
def update(self):
count = 0
while self.__running.isSet():
if self.stream.isOpened():
self.__flag.wait() # 为True时立即返回, 为False时阻塞直到内部的标识位为True后返回
if self.stopped:
return
(self.grabbed, self.frame) = self.stream.read()
else:
self.__flag.wait() # 为True时立即返回, 为False时阻塞直到内部的标识位为True后返回
print("The video{} is not open!!".format(self.src))
self.stream = cv2.VideoCapture(self.src + 1)
self.stream.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
self.stream.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
def read(self):
return self.frame
def pause(self):
self.__flag.clear() # 设置为False, 让线程阻塞
def resume(self):
self.__flag.set() # 设置为True, 让线程停止阻塞
def stop(self):
# self.__flag.set() # 将线程从暂停状态恢复, 如果已经暂停的话
self.__running.clear() # 设置为False
self.stream.release()
self.stopped = True
time.sleep(0.1)
if __name__ == "__main__":
camera = Camera(0)
camera1 = Camera(1)
camera2 = Camera(2)
camera.start()
camera1.start()
camera2.start()
start = end = time.time()
begin = endd = False
try:
while True:
end = time.time()
img = camera.read()
img1 = camera1.read()
img2 = camera2.read()
if end - start > 10 and begin == False:
camera.pause()
begin = True
if end - start > 20 and endd == False:
endd = True
camera.resume()
finally:
camera.stop()
camera1.stop()
camera2.stop()
# cv2.imshow("img", img)
# cv2.waitKey(1)