import cv2 import roop.globals import ui.globals import pyvirtualcam import threading import platform cam_active = False cam_thread = None vcam = None def virtualcamera( swap_model, streamobs, use_xseg, use_mouthrestore, cam_num, width, height ): from roop.ProcessOptions import ProcessOptions from roop.core import live_swap, get_processing_plugins global cam_active # time.sleep(2) print("Starting capture") cap = cv2.VideoCapture( cam_num, cv2.CAP_DSHOW if platform.system() != "Darwin" else cv2.CAP_AVFOUNDATION, ) if not cap.isOpened(): print("Cannot open camera") cap.release() del cap return pref_width = width pref_height = height pref_fps_in = 30 cap.set(cv2.CAP_PROP_FRAME_WIDTH, pref_width) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, pref_height) cap.set(cv2.CAP_PROP_FPS, pref_fps_in) cam_active = True # native format UYVY cam = None if streamobs: print("Detecting virtual cam devices") cam = pyvirtualcam.Camera( width=pref_width, height=pref_height, fps=pref_fps_in, fmt=pyvirtualcam.PixelFormat.BGR, print_fps=False, ) if cam: print(f"Using virtual camera: {cam.device}") print(f"Using {cam.native_fmt}") else: print(f"Not streaming to virtual camera!") subsample_size = roop.globals.subsample_size options = ProcessOptions( swap_model, get_processing_plugins("mask_xseg" if use_xseg else None), roop.globals.distance_threshold, roop.globals.blend_ratio, "all", 0, None, None, 1, subsample_size, False, use_mouthrestore, ) while cam_active: ret, frame = cap.read() if not ret: break if len(roop.globals.INPUT_FACESETS) > 0: frame = live_swap(frame, options) if cam: cam.send(frame) cam.sleep_until_next_frame() ui.globals.ui_camera_frame = frame if cam: cam.close() cap.release() print("Camera stopped") def start_virtual_cam( swap_model, streamobs, use_xseg, use_mouthrestore, cam_number, resolution ): global cam_thread, cam_active if not cam_active: width, height = map(int, resolution.split("x")) cam_thread = threading.Thread( target=virtualcamera, args=[ swap_model, streamobs, use_xseg, use_mouthrestore, cam_number, width, height, ], ) cam_thread.start() def stop_virtual_cam(): global cam_active, cam_thread if cam_active: cam_active = False cam_thread.join()