ubuntuusers.de

Zoom - virtueller Hintergrund

Status: Ungelöst | Ubuntu-Version: Kubuntu 20.10 (Groovy Gorilla)
Antworten |

hakel2020

Anmeldungsdatum:
21. Januar 2021

Beiträge: 1169

Ist das wirklich so eine schlimme Sache, das mit dem virtuellem Hintergrund?

Auf jeden Fall, das ist "Hightech" !

Zoom sagt, i5 - i7 in den Systemanforderungen. Macht auch Sinn, da wird in Echtzeit Video manipuliert - toll!

P.S. Frag' doch mal in deiner Gemeinde nach "Altgeräten". Ich kenne Leute da stapeln sich die -ungenutzen- Apples ...

von.wert

Anmeldungsdatum:
23. Dezember 2020

Beiträge: 13781

annisonne schrieb:

Ich möchte mich bei Euch entschuldigen.

Du brauchst nicht dauernd um Entschuldigung bitten, bisher eigentlich gar nicht.

Ist das wirklich so eine schlimme Sache, das mit dem virtuellem Hintergrund?

Was soll denn "schlimm" heißen? Für sowas sind eben bestimmte Systemvoraussetzungen zu bringen, nicht nur irgendwelche Gigahertz, sondern Funktionen in Prozessoren. Wenn Deiner nicht die Hardware-Voraussetzungen, die die Software Zoom dafür braucht, bietet, geht das eben nicht. Man kann nichts erzwingen.

Manches kann man vielleicht auf anderem Wege in Software erreichen (das, was seahawk1986 mit Tricksen meint), aber mindestens umständlicher und zeitaufwendiger. Ob das in Verbindung mit Zoom funktioniert, ist eine ganz andere Frage.

annisonne

(Themenstarter)

Anmeldungsdatum:
17. Oktober 2006

Beiträge: 161

Wohnort: Winsen-Luhe

Ich möchte hiermit das Tread abbrechen, weil es zu nichts bringt. Danke für alle Eure Hilfe. Ich werde es als ungelöst abschließen.

voxxell99

Avatar von voxxell99

Anmeldungsdatum:
23. September 2009

Beiträge: 3932

Wohnort: da, wo andere Urlaub machen. :)

Wenn du dabei wenigstens gelernt hast, dass man nicht so einfach beliebige CPUs in beliebige Laptops stopfen kann, war es ja nicht völlig umsonst.... 😉

Jetzt hast du einen i5 übrig?? Welchen denn genau? (Link zum Angebot)

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11300

Wohnort: München

von.wert schrieb:

Manches kann man vielleicht auf anderem Wege in Software erreichen (das, was seahawk1986 mit Tricksen meint), aber mindestens umständlicher und zeitaufwendiger. Ob das in Verbindung mit Zoom funktioniert, ist eine ganz andere Frage.

Dank vorhandener Abstraktionen ist ein Prototyp recht schnell fertig (wenn man da weiter optimieren will, kann man natürlich viel Zeit versenken) - ich habe das für einen ersten Versuch so gemacht:

sudo apt install v4l2loopback-dkms python3-opencv python3-venv python3-wheel v4l-utils
mkdir ~/replace_webcam_bg
cd ~/replace_webcam_bg
python3 -m venv .venv --system-site-packages
. .venv/bin/activate
pip install -U pip
pip install -U pyfakewebcam 

Jetzt aktivieren wir das Modul für die virtuelle Webcam und lassen es ein Device anlegen:

sudo modprobe v4l2loopback devices=1 

Damit sollte es jetzt neben der Webcam ein Loopback-Device geben, also sollte man z.B. sowas sehen können:

$ v4l2-ctl --list-devices
Dummy video device (0x0000) (platform:v4l2loopback-000):
        /dev/video2

VirtualBox Webcam - USB2.0 HD U (usb-0000:00:1f.4-1):
        /dev/video0
        /dev/video1
        /dev/media0 

Damit ist die Webcam /dev/video0 und die virtuelle Webcam /dev/video2. Damit man mit Benutzerrechten auf die Kamera zugreifen darf, muss der Nutzer Mitglied in der Gruppe video sein.

Wir suchen uns außerdem noch ein Hintergrundbild aus und legen das als background.jpg ab - z.B.:

wget https://fanart.tv/fanart/movies/583/moviebackground/monty-pythons-life-of-brian-5a927a38c9b8f.jpg -O background.jpg 

Jetzt brauchen wir ein Python-Skript background_removal.py, das die Webcam ausliest, die Differenz zu einem Referenzbild als Maske berechnet und einen Hintergrund platziert und die Daten weiterreicht - in misbah4064/backgroundRemoval gibt es eine brauchbare Vorlage, die mit kleinen Anpassungen ein statische Hintergrundbild statt einem Video nutzt und das Bild für die virtuelle Webcam rausschreibt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/env python3
# Background Removal using Python and OpenCV. Replacing the background with an image
import cv2
import pyfakewebcam
import numpy as np

WEBCAM_NUM = 0
VIRTUAL_CAM = '/dev/video2'

def resize(dst,img):
        width = img.shape[1]
        height = img.shape[0]
        dim = (width, height)
        resized = cv2.resize(dst, dim, interpolation = cv2.INTER_AREA)
        return resized

video = cv2.VideoCapture(WEBCAM_NUM)
video.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
video.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

success, ref_img = video.read()
flag = 0
camera = pyfakewebcam.FakeWebcam(VIRTUAL_CAM, 640, 480)

bg = cv2.imread('background.jpg')
bg = resize(bg,ref_img)

while(1):
        success, img = video.read()
        if flag==0:
                ref_img = img
        # create a mask
        diff1=cv2.subtract(img,ref_img)
        diff2=cv2.subtract(ref_img,img)
        diff = diff1+diff2
        diff[abs(diff)<13.0]=0
        gray = cv2.cvtColor(diff.astype(np.uint8), cv2.COLOR_BGR2GRAY)
        gray[np.abs(gray) < 10] = 0
        fgmask = gray.astype(np.uint8)
        fgmask[fgmask>0]=255
        #invert the mask
        fgmask_inv = cv2.bitwise_not(fgmask)
        #use the masks to extract the relevant parts from FG and BG
        fgimg = cv2.bitwise_and(img,img,mask = fgmask)
        bgimg = cv2.bitwise_and(bg,bg,mask = fgmask_inv)
        #combine both the BG and the FG images
        dst = cv2.add(bgimg,fgimg)
        cv2.imshow('Background Removal',dst)
        #write image to virtual cam
        camera.schedule_frame(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB))
        key = cv2.waitKey(5) & 0xFF
        if ord('q') == key:
                break
        elif ord('d') == key:
                flag = 1
                print("Background Captured")
        elif ord('r') == key:
                flag = 0
                print("Ready to Capture new Background")

cv2.destroyAllWindows()
video.release()

Dann das Skript starten:

~/replace_webcam_bg/.venv/bin/python3 background_removal.py 

Der Hintergrund sollte möglichst einfarbig sein (dann fallen kleine Wackler und Positionsänderungen der Webcam nicht auf) und einen hohen Kontrast zu Kopf und Kleidung bieten - eine dunkle Wolldecke ist da für Mitteleuropäer im Winter keine schlechte Wahl. Die Ausleuchtung sollte möglichst konstant sein (am besten wie bei Greenscreen-Aufnahmen generell Vordergrund und Hintergrund getrennt ausleuchten, und das am besten von zwei Seiten, um Schattenwürfe zu vermeiden - https://www.lighting-academy.com/index.php?id=838 für Anregungen, wie man das mit Dingen umsetzen kann, die man vielleicht sogar schon im Haushalt hat.

Beim Starten des Skripts macht das Programm ein Bild, das als Referenzbild zur Differenzberechnung dient - man sollte also aus dem Bild der Webcam treten, bevor man das Programm startet. Mit R kann man nur das Hintergrundbild darstellen lassen, mit D kann man das aktuelle Bild von der Webcam als neues Referenzbild festlegen (z.B. nützlich, wenn sich die Beleuchtung oder der Hintergrund geändert hat). Mit Q kann man das Skript beenden.

Wenn das Skript läuft den Zoom-Client starten und die virtuelle Webcam auswählen (die normale Webcam lässt sich nicht nutzen, solange das Skript läuft)

von.wert

Anmeldungsdatum:
23. Dezember 2020

Beiträge: 13781

seahawk1986, jetzt hast Du Dir einen Haufen Mühe gegeben (und vermutlich umsonst).

Das Ganze funktioniert ohne merkbare Verzögerung? Mit solchen CPUs? Muß schließlich on-the-fly gehen. Nichts ist nerviger als Ton-Bild-Versatz.

dirkolus

Anmeldungsdatum:
17. Mai 2011

Beiträge: 2181

Wohnort: dahoam

ich .. bin .. begeistert!

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11300

Wohnort: München

von.wert schrieb:

seahawk1986, jetzt hast Du Dir einen Haufen Mühe gegeben (und vermutlich umsonst).

Das Ganze funktioniert ohne merkbare Verzögerung? Mit solchen CPUs? Muß schließlich on-the-fly gehen. Nichts ist nerviger als Ton-Bild-Versatz.

Man führt damit natürlich eine kleine Verzögerung ein, die aber unter einem Frame liegen sollte. Falls es doch einen störend großen Bild-Ton-Versatz (die Wahrnehmungsschwelle liegt IIRC so bei ca. 40 ms) geben sollte, müsste man über das loopback-Modul von Pulseaudio ausgleichen können.

Mein Problem ist, dass die Webcam von meinem alten Laptop bei der höchsten möglichen Auflösung (640x480) keine 30 FPS liefert, weshalb ich nicht testen kann, ob das auf einem Core2 Duo T7500 bei der Auflösung auch mit 30 FPS flüssig laufen würde - ich komme bei 640x480 mit Lampe im Gesicht nur auf ca. 10 FPS und bei 320x240 je nach Belichtung auf 15 bzw. 30 FPS (da limitiert die von der Webcam automatisch gewählte Belichtungszeit).

Wer mal damit spielen will: ich habe eine Portierung nach C++ angehängt, bei der ich einen (ungefähren) FPS-Zähler eingebaut habe. Zum Kompilieren benötigt man das Paket libopencv-dev und die üblichen Verdächtigen - beide Dateien in ein Verzeichnis kopieren, ggf. Auflösung und Pfade für die Webcams anpassen, eine background.jpg dazu und make aufrufen. Danach das Programm mit ./remove-background starten.

remove_background.cpp (7.3 KiB)
Download remove_background.cpp
Makefile (197 Bytes)
Download Makefile

annisonne

(Themenstarter)

Anmeldungsdatum:
17. Oktober 2006

Beiträge: 161

Wohnort: Winsen-Luhe

Ich mache weiter, seaheawk.

Bis dahin bin ich gekommen:

sudo modprobe v4l2loopback devices=1

Bei mir steht die Antwort:

(.venv) annisonne@annisonne:~/replace_webcam_bg$

Ist das richtig so?

MfG Annelie

annisonne

(Themenstarter)

Anmeldungsdatum:
17. Oktober 2006

Beiträge: 161

Wohnort: Winsen-Luhe

Ich bin bis jetzt soweit gekommen:

annisonne@annisonne:~$ v4l2-ctl --list-devices
Integrated Camera: Integrated C (usb-0000:00:1d.7-6):
        /dev/video0
        /dev/video1

Da steht nichts mit

VirtualBox Webcam - USB2.0 HD U (usb-0000:00:1f.4-1):
        /dev/video0
        /dev/video1
        /dev/media0 

Was soll ich jetzt machen?

MfG Annelie

annisonne

(Themenstarter)

Anmeldungsdatum:
17. Oktober 2006

Beiträge: 161

Wohnort: Winsen-Luhe

Ich habe das noch einmal gemacht und bekomme jetzt diese Ausgabe

(.venv) annisonne@annisonne:~/replace_webcam_bg$ v4l2-ctl --list-devices
Dummy video device (0x0000) (platform:v4l2loopback-000):
        /dev/video2

Integrated Camera: Integrated C (usb-0000:00:1d.7-6):
        /dev/video0
        /dev/video1

Ich glaube, das ist jetzt richtig so.

MfG Annelie

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11300

Wohnort: München

Der Name der Webcam hängt natürlich davon ab, mit welcher Hardware man das ganze nutzt. Bislang sieht das gut aus, das v4l2loopback Device existiert mit der erwarteten Nummer.

Antworten |