Shit / roop /virtualcam.py
brentph504's picture
Upload 58 files
632bd54 verified
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()