### 將camera包裝成class ```python class CameraCv(object): def __init__(self, videoSource=0): self.videoSource = videoSource self.camera = None self.cameraWidth = 0 self.cameraHeight = 0 self.cameraPreviewThreadHandle = None self.cameraPreviewThreadStopEvent = threading.Event() self.lastframeRGB = None self.latestFrame = None def start(self): print("Open Camera") self.camera = cv2.VideoCapture(self.videoSource, cv2.CAP_DSHOW) if not self.camera.isOpened(): raise ValueError("Unable to open video source {}".format(self.videoSource)) # Get video source width and height self.cameraWidth = self.camera.get(cv2.CAP_PROP_FRAME_WIDTH) self.cameraHeight = self.camera.get(cv2.CAP_PROP_FRAME_HEIGHT) self.cameraPreviewThreadStopEvent.clear() self.cameraPreviewThreadHandle = threading.Thread(target=self.collectFrame, daemon=True, args=()) self.cameraPreviewThreadHandle.start() def stop(self): print("Close Camera") self.cameraPreviewThreadStopEvent.set() if self.camera.isOpened(): self.camera.release() cv2.destroyAllWindows() def collectFrame(self): while True: ret, frame = self.camera.read() if ret: # Return a boolean success flag and the current frame converted to BGR self.lastframeRGB = frame self.latestFrame = ImageTk.PhotoImage(image=Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))) if self.cameraPreviewThreadStopEvent.is_set(): break time.sleep(0.016) def draw(self, container): if self.latestFrame is not None: container.imgtk = self.latestFrame container.configure(image=self.latestFrame) def read(self): return self.camera.read() def getLastFrameRgb(self): return self.lastframeRGB def saveFrame(self, filepath): cv2.imwrite(filepath, self.getLastFrameRgb()) ```