ゲームでは 3 台のカメラを使用する必要があるため、プログラムはマルチスレッド アーキテクチャになっており、メイン スレッドはメイン スレッドで 3 つのサブカメラ スレッドを開きます (メイン ループで別の 3 つのデッド ループを同時に実行します)。このカメラは写真の撮影に多くの CPU リソースとメモリを消費します。CPU のビジー状態を軽減するために、使用する必要がある場合は特定のカメラを有効にし、使用しない場合は対応するカメラ スレッドを一時停止することが考えられます。使用中で;
カメラスレッドオブジェクトコードの改善:
threading.Event() フラグは、スレッドを一時停止および再開するために使用されます。具体的なコードの説明については、上記の参考ブログを参照してください。
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)