Tokie skaitytojai kaip jūs padeda palaikyti MUO. Kai perkate naudodami nuorodas mūsų svetainėje, galime uždirbti filialų komisinius. Skaityti daugiau.

Veido suliejimą galite naudoti norėdami paslėpti asmens veidą vaizdo įraše ar vaizde dėl kelių priežasčių. Privatumo ir saugumo problemos yra labiausiai paplitusios. Daugumoje vaizdo įrašų bendrinimo platformų ir vaizdo įrašų redagavimo programinės įrangos yra integruota veido suliejimo funkcija.

Galite sukurti savo veido suliejimo programą nuo nulio naudodami Python ir OpenCV bei NumPy bibliotekas.

Aplinkos nustatymas

Norėdami tęsti šį straipsnį, turite susipažinti su Python pagrindai ir turėti pagrindinį supratimą naudojant NumPy biblioteką.

Atidarykite bet kurį jums patinkantį Python IDE. Sukurkite virtualią aplinką, kurioje įdiegsite reikiamas bibliotekas. Sukurkite naują Python failą. Eikite į terminalą ir paleiskite šią komandą, kad įdiegtumėte reikiamas bibliotekas. Perduokite bibliotekas kaip tarpais atskirtą sąrašą.

pip įdiegti OpenCV-python NumPy
instagram viewer

Norėdami paimti ir iš anksto apdoroti vaizdo įvestį, naudosite OpenCV, o darbui su masyvais – NumPy.

Įdiegę bibliotekas palaukite, kol IDE atnaujins projekto skeletus. Kai atnaujinimas bus baigtas ir aplinka paruošta, galite pradėti koduoti.

Visą šaltinio kodą rasite a GitHub saugykla.

Reikalingų bibliotekų importavimas

Pradėkite importuodami OpenCV ir NumPy bibliotekas. Taip galėsite skambinti ir naudotis visomis jų palaikomomis funkcijomis. Importuoti OpenCV-python kaip cv2.

importuoti cv2
importuoti nelygus kaip np

OpenCV-python moduliai naudoja pavadinimą cv2 kaip susitarimą, kurį sukūrė OpenCV bendruomenė. „OpenCV-python“ yra „OpenCV“ bibliotekos Python paketas, parašytas C++.

Priimant jūsų įnašą

Sukurkite kintamąjį ir inicijuokite Vaizdo įrašas objektas. Įveskite nulį kaip argumentą, jei kaip įvesties šaltinį norite naudoti pagrindinę kompiuterio kamerą. Norėdami naudoti išorinę kamerą, prijungtą prie kompiuterio, palikite vieną. Norėdami sulieti veidą iš anksto įrašytame vaizdo įraše, pravažiuokite vaizdo įrašo kelią. Į naudoti nuotolinę kamerą, perduokite fotoaparato URL adresą su IP adresu ir prievado numeriu.

cap = cv2.VideoCapture(0)

Norėdami atlikti veido suliejimą įvestyje, jums reikės trijų funkcijų:

  • Funkcija, kuri iš anksto apdoros įvestį.
  • Funkcija, kuri sulieja veidą įvestyje.
  • Pagrindinė funkcija, kuri valdys programos eigą ir parodys išvestį.

Išankstinis vaizdo įvesties apdorojimas

Sukurkite įvesties išankstinio apdorojimo funkciją, kuri kiekvieną įvesties vaizdo įrašo kadrą naudos kaip įvestį. Inicijuokite CascadeClassifier klasę, kurią naudosite veido aptikimui. Pakeiskite kadro dydį iki 640 x 640 pikselių. Konvertuokite pakeisto dydžio rėmelį į pilkos spalvos toną, kad būtų lengviau apdoroti, ir galiausiai aptikkite veidus įvestyje ir suriškite juos stačiakampiais.

defimage_preprocess(rėmas):
face_detector = cv2.CascadeClassifier (cv2.data.haarcascades
+ „haarcascade_frontalface_default.xml“)

resized_image = cv2.resize (rėmas, (640, 640))

gray_image = cv2.cvtColor (pakeisto_vaizdo dydžio,
cv2.COLOR_BGR2GRAY)

face_rects = face_detector.detectMultiScale(
pilkas_vaizdas, 1.04, 5, minSize=(20, 20))

grąžinti pakeistas_vaizdas, veido_tiesiogiai

Ši funkcija grąžina seką, kurioje yra pakeisto dydžio vaizdas ir stačiakampių, vaizduojančių aptiktus veidus, sąrašą.

Veido suliejimas

Sukurkite suliejimo funkciją, kuri sulies veidus jūsų įvestyje. Funkcija kaip įvestį paima pakeisto dydžio rėmelį ir stačiakampių, ribojančių paviršius, kuriuos grąžina išankstinio apdorojimo funkcija, sąrašą. Kilpos per kiekvieną veido stačiakampį. Apskaičiuoja kiekvieno stačiakampio centrą ir suliejamo apskritimo spindulį. Sukuria juodą vaizdą, kurio matmenys tokie pat kaip ir pakeisto rėmelio, inicijuojant visus pikselius iki nulio. Nupiešia baltą apskritimą ant juodo vaizdo, kurio centras yra prie veido stačiakampio, naudojant apskaičiuotą spindulį. Galiausiai jis sulieja vaizdą ant balto apskritimo.

defface_blur(pakeistas_rėmo dydis, veido_tiesiogiai):
dėl (x, y, w, h) in face_rects:
# Nurodykite centrą ir spindulį
# iš suliejamo apskritimo
centras_x = x + w // 3
centras_y = y + h // 3
spindulys = h // 1

# sukurti juodą vaizdą, turintį panašų
# matmenys kaip rėmas
mask = np.zeros((resized_frame.shape[:3]), np.uint8)

# nubrėžkite baltą apskritimą rėmelio priekinėje srityje
cv2.circle (kaukė, (centras_x, centras_y), spindulys,
(255, 255, 255), -1)

# sulieja visą kadrą
blurred_image = cv2.medianBlur (pakeisto_kadro dydžio, 99)

# rekonstruoti kadrą:
# – pikseliai iš neryškaus kadro, jei kaukė > 0
# – kitu atveju paimkite pikselius iš pradinio kadro
pakeistas_kadras = np.kur (kaukė > 0, neryškus_vaizdas,
pakeistas_rėmo dydis)

grąžinti pakeistas_rėmo dydis

Funkcija naudoja NumPy kur () funkcija atkurti kadrą suliejimo metu.

Programos srauto valdymas

Sukurkite pagrindinę funkciją, kuri veiks kaip jūsų programos įėjimo taškas. Tada jis valdys programos eigą. Funkcija pradės begalinį ciklą, kad nuolat fiksuotų vaizdo įvesties kadrus. Iškvieskite dangtelio objekto skaitymo metodą, kad nuskaitytumėte kadrą iš fotoaparato.

Tada funkcija perduos kadrą išankstinio apdorojimo funkcijai, o grąžinimo reikšmes – kitai funkcijai face_blur, kad vaizdas būtų neryškus. Tada jis pakeičia suliejimo funkcijos grąžinto kadro dydį ir parodo išvestį.

defpagrindinis():
kolTiesa:
sėkmė, rėmelis = cap.read()
resized_input, face_rects = vaizdo_preprocesas (rėmas)
blurred_image = veido_suliejimas (pakeisto įvesties dydžio, veido_tiesiogiai)

# Rodomas neryškus vaizdas
cv2.imshow(„Neryškus vaizdas“, cv2.resize (blurred_image, (500, 500)))

jeigu cv2.waitKey(1) == ord("q"):
pertrauka

Funkcija taip pat nutraukia išvesties ekraną, kai vartotojas paspaudžia q klavišą.

Programos vykdymas

Įsitikinkite, kad paleisdami scenarijų pirmiausia paleidžiama pagrindinė funkcija. Ši sąlyga bus klaidinga, jei scenarijų importuosite kaip modulį į kitą programą.

jeigu __vardas__ == "__pagrindinis__":
pagrindinis ()

Tai leidžia naudoti scenarijų kaip modulį arba paleisti jį kaip atskirą programą. Kai programa paleista, turėtumėte matyti panašią išvestį:

Veidas neryškus ir neatpažįstamas.

Veido suliejimo taikymas realiame pasaulyje

Norėdami apsaugoti žmonių privatumą, galite taikyti veido suliejimą įvairiose programose. Gatvės vaizdo ir žemėlapių paslaugos naudoja suliejimą, kad sulietų žmonių veidus užfiksuotuose vaizduose. Teisėsauga naudoja veidų suliejimą, kad apsaugotų liudytojų tapatybę.

Daugelis vaizdo įrašų bendrinimo platformų taip pat integravo veido suliejimo funkciją savo vartotojams. Palyginę veido suliejimo naudojimą šiose srityse, galėsite stebėti, kaip kitos platformos integruoja technologiją.