Kohdista virtuaaliset päät oikeiden kasvojen kanssa Unityssa MediaPipen avulla

MediaPipe

Virtuaalipään sijoittelun haasteita AR-kehityksessä

Lisätyn todellisuuden (AR) -projektin parissa työskenteleminen voi olla sekä jännittävää että haastavaa. Kun kehitin Android-sovellusta Unityn kanssa, pyrin sulattamaan digitaalisen ja todellisen maailman saumattomasti asettamalla virtuaalisen pään todellisten kasvojen päälle. Tämä ominaisuus luottaa mukaansatempaavan kokemuksen luomiseen vahvasti tarkkuuteen. 🕶️

Tämän saavuttamiseksi käytin Googlen MediaPipeä tunnistamaan kasvojen maamerkit, kuten silmät, nenät ja suun. Tämän jälkeen virtuaalinen pää luotiin ja sijoitettiin näiden avainkohtien perusteella. Oli kiehtovaa nähdä, kuinka nykyaikaiset työkalut voivat muuttaa AR-mahdollisuuksia, mutta matka oli kaukana täydellisestä.

Ongelma ilmeni, kun virtuaalinen pää ei ollut linjassa todellisten kasvojen kanssa odotetulla tavalla. Kulmasta tai laitteesta riippumatta sijoitus oli aina hieman "pois", mikä johti luonnottomaan vaikutukseen. Tuntui kuin virtuaaliesitys olisi irronnut todellisuudesta. Tämä sai aikaan sarjan vianetsintäkokeita.

Unityn kamera-asetusten säätämisestä MediaPipe-algoritmin kokeilemiseen jokainen yritys toi asteittain parannuksia, mutta ei lopullista ratkaisua. Tässä artikkelissa käsitellään ongelman ydintä, saatuja kokemuksia ja mahdollisia ratkaisuja samankaltaisten haasteiden edessä oleville kehittäjille. 🚀

Komento Käyttöesimerkki
mainCamera.usePhysicalProperties Tämä komento mahdollistaa Unityn fyysisten kameraominaisuuksien käytön, mikä mahdollistaa tarkemman polttovälin ja objektiivin vääristymän hallinnan virtuaalisten ja todellisten kohteiden kohdistamiseksi.
faceMesh.GetDetectedFaceTransform() Hakee tunnistettujen kasvojen muunnostiedot (sijainti ja kierto) MediaPipen kasvoverkosta, mikä on ratkaisevan tärkeää virtuaalisten päiden sijoittamiseksi tarkasti todellisten kasvojen päälle.
UnityObjectToClipPos Varjostinkohtainen toiminto, joka muuntaa kärjen sijainnin objektitilasta leiketilaan. Käytetään linssin vääristymän korjausvarjostimissa tasauksen varmistamiseksi.
tex2D Shader-komento, jota käytetään näyttelemään tekstuuria määritetyillä UV-koordinaateilla, ja se on välttämätön vääristymän korjaamiseksi kameran syötteisiin.
length(distUV) Laskee UV-koordinaattien euklidisen etäisyyden origosta, jota hyödynnetään asteittaisten linssin vääristymien säädöissä.
adjuster.virtualHead Virtuaalipäähän GameObject viittaava komentosarjamuuttuja, jonka avulla sen sijaintia ja kiertoa voidaan päivittää dynaamisesti kasvojen seurantatietojen perusteella.
[TestFixture] NUnit-attribuutti, joka merkitsee luokan testivälineeksi, mikä osoittaa, että se sisältää yksikkötestejä. Tästä on hyötyä virtuaalisen pään kohdistuslogiikan tarkistamisessa.
Assert.AreEqual NUnit-menetelmä, jota käytetään odotettujen ja todellisten arvojen vertaamiseen yksikkötestauksen aikana varmistaen, että virtuaalisen pään sijoitus vastaa haluttuja tuloksia.
_DistortionStrength Shader-ominaisuus, joka säätää linssin vääristymän voimakkuutta ja hienosäätää todellisen ja virtuaalisen maailman välistä kohdistusta.
Quaternion.Euler Luo Euler-kulmiin perustuvan kierron, jota käytetään yleisesti kohteiden, kuten virtuaalisen pään, kohdistamiseen Unityn 3D-tilassa.

AR-tarkkuuden parantaminen Unityn ja MediaPipen avulla

Ensimmäinen tutkimamme käsikirjoitus keskittyy Unityn fyysisten kameraominaisuuksien käyttöön. Ottamalla käyttöön , säädämme kameran käyttäytymistä vastaamaan paremmin todellista optiikkaa. Tämä on erityisen tärkeää AR:n kanssa työskennellessä, jossa pienetkin polttovälin tai näkökentän erot voivat saada virtuaalikohteet näyttämään vääristyneiltä. Esimerkiksi polttovälin asettaminen tarkaan arvoon, kuten 35 mm, voi auttaa kohdistamaan virtuaalisen pään havaittujen kasvojen kanssa. Tämä säätö muistuttaa kaukoputken hienosäätöä kaukaisten kohteiden tarkentamiseksi täydellisesti, mikä varmistaa, että AR-kokemus tuntuu luonnolliselta ja mukaansatempaavalta. 📸

Toinen käsikirjoituksen tärkeä komponentti on havaittujen kasvojen sijainnin ja pyörimisen hakeminen käyttämällä . Tämä toiminto tarjoaa reaaliaikaisia ​​päivityksiä MediaPipen kasvoverkosta, mikä on välttämätöntä virtuaalisen pään synkronoimiseksi käyttäjän liikkeiden kanssa. Kuvittele pelaavasi videopeliä, jossa hahmosi pää ei liiku samassa tahdissa omasi kanssa. kokemus olisi järkyttävä. Varmistamalla tarkan kohdistuksen tämä skripti muuttaa AR:n uutuudesta työkaluksi, joka voi tukea sovelluksia, kuten virtuaalisia kokouksia tai edistyksellistä pelaamista.

Toinen skripti käsittelee Shader-ohjelmointia, erityisesti linssin vääristymistä. Varjostin korjaa kameran syötteen vääristymiä käyttämällä ominaisuuksia, kuten _DistortionStrength, manipuloimaan UV-koordinaattien kartoittamista pintakuvioon. Tämä on erityisen hyödyllistä käytettäessä laajakulmaobjektiiveja tai kameroita, joissa on ainutlaatuiset vääristymäprofiilit. Jos esimerkiksi virtuaalipää näyttää kulmasta riippuen suuremmalta tai pienemmältä kuin todelliset kasvot, vääristymisasetusten säätäminen varmistaa paremman kohdistuksen. Se on kuin peilin kehyksen säätäminen eliminoimaan huvihuoneilmiön, mikä tekee heijastuksista realistisempia. 🎨

Lopuksi kolmannen komentosarjan yksikkötestit vahvistavat ratkaisut. Näissä testeissä verrataan virtuaalisen pään odotettua asentoa ja pyörimistä todellisiin tuloksiin ja varmistetaan, että säädöt kestävät eri olosuhteissa. NUnitin käyttäminen , kehittäjät voivat simuloida erilaisia ​​skenaarioita, kuten liikuttaa päätä nopeasti tai kallistaa sitä äärimmäisissä kulmissa varmistaakseen kohdistuksen. Esimerkiksi kehitystyön aikana huomasin, että kohdistus toimi hyvin eteenpäin katsottaessa, mutta ajautui pään kääntyessä sivulle. Nämä yksikkötestit korostivat ongelmaa ja ohjasivat lisäparannuksia, mikä vahvisti perusteellisen testauksen merkitystä vahvojen AR-sovellusten luomisessa. 🚀

Virtuaaliobjektien sijoittelun säätäminen AR:ssä Unityn ja MediaPipen avulla

Ratkaisu 1: Unityn fyysisen kameran käyttö FOV:n ja linssin vääristymän säätämiseen

// Import necessary Unity libraries
using UnityEngine;
using Mediapipe.Unity;

public class VirtualHeadAdjuster : MonoBehaviour
{
    public Camera mainCamera; // Assign Unity's physical camera
    public GameObject virtualHead; // Assign the virtual head prefab
    private MediapipeFaceMesh faceMesh; // MediaPipe's face mesh component

    void Start()
    {
        // Enable Unity's physical camera
        mainCamera.usePhysicalProperties = true;
        mainCamera.focalLength = 35f; // Set a standard focal length
    }

    void Update()
    {
        if (faceMesh != null && faceMesh.IsTracking)
        {
            // Update the virtual head's position and rotation
            Transform detectedHead = faceMesh.GetDetectedFaceTransform();
            virtualHead.transform.position = detectedHead.position;
            virtualHead.transform.rotation = detectedHead.rotation;
        }
    }
}

Vaihtoehtoisten säätöjen tutkiminen virtuaaliseen pään kohdistukseen

Ratkaisu 2: Mukautetun varjostimen käyttäminen linssin vääristymän korjaamiseen

Shader "Custom/LensDistortionCorrection"
{
    Properties
    {
        _DistortionStrength ("Distortion Strength", Float) = 0.5
    }

    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            float _DistortionStrength;

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                float2 distUV = i.uv - 0.5;
                distUV *= 1.0 + _DistortionStrength * length(distUV);
                distUV += 0.5;
                return tex2D(_MainTex, distUV);
            }
            ENDCG
        }
    }
}

Testataan parannettua yhteensopivuutta Unityn AR-projekteissa

Ratkaisu 3: Yksikkötestien toteuttaminen virtuaalisen pään kohdistusta varten

using NUnit.Framework;
using UnityEngine;
using Mediapipe.Unity;

[TestFixture]
public class VirtualHeadAlignmentTests
{
    private VirtualHeadAdjuster adjuster;
    private GameObject testHead;

    [SetUp]
    public void Init()
    {
        GameObject cameraObject = new GameObject("MainCamera");
        adjuster = cameraObject.AddComponent<VirtualHeadAdjuster>();
        testHead = new GameObject("VirtualHead");
        adjuster.virtualHead = testHead;
    }

    [Test]
    public void TestVirtualHeadAlignment()
    {
        Vector3 expectedPosition = new Vector3(0, 1, 2);
        Quaternion expectedRotation = Quaternion.Euler(0, 45, 0);

        adjuster.virtualHead.transform.position = expectedPosition;
        adjuster.virtualHead.transform.rotation = expectedRotation;

        Assert.AreEqual(expectedPosition, testHead.transform.position);
        Assert.AreEqual(expectedRotation, testHead.transform.rotation);
    }
}

AR-sijoittelun parantaminen tehostettujen kalibrointitekniikoiden avulla

Yksi usein huomiotta jätetty näkökohta AR-kohdistusongelmissa on kameran kalibroinnin merkitys. AR-projekteissa, kuten virtuaalisen pään asettaminen todellisen, objektiivin päälle on tärkeä rooli. Nämä parametrit sisältävät polttovälin, optisen keskipisteen ja vääristymäkertoimet. Jos nämä arvot eivät ole tarkkoja, virtuaalipää saattaa näyttää väärältä tai vääristyneeltä. Tämän korjaamiseksi voidaan käyttää kalibrointityökaluja näiden parametrien laskemiseen tietylle laitekameralle. Esimerkiksi OpenCV:n kaltaiset ohjelmistot tarjoavat vankkoja kalibrointiapuohjelmia tarkkojen kameramatriisien ja vääristymäprofiilien luomiseen. 📐

Toinen lähestymistapa sisältää Unityn hyödyntämisen . Käyttämällä tehosteita, kuten syväterävyyden tai kromaattisten poikkeamien korjauksia, voit tasoittaa eroja renderoidun virtuaalisen pään ja todellisen ympäristön välillä. Jälkikäsittely lisää kiillotuskerroksen, joka kattaa virtuaalisten objektien ja fyysisten tilojen välisen kuilun. Esimerkiksi hienovarainen sumennustehoste voi vähentää jyrkkiä reunoja, jotka tekevät kohdistusvirheistä havaittavia. Tämä on erityisen hyödyllistä immersiivisissä sovelluksissa, joissa käyttäjät ovat erittäin keskittyneet tilanteeseen.

Lopuksi, älä aliarvioi dynaamisen mukautumisen tehoa ajon aikana. Koneoppimismallien sisällyttäminen AR-putkistoon voi antaa järjestelmän oppia ja säätää sijoittelua ajan myötä. Tekoälymalli voisi esimerkiksi analysoida käyttäjien palautetta tai havaittuja epäjohdonmukaisuuksia ja hienosäätää kohdistusta dynaamisesti. Tämä tekee järjestelmästä kestävämmän ja pystyy käsittelemään valaistuksen, laitteen suorituskyvyn tai käyttäjän käyttäytymisen vaihteluita. Nämä parannukset varmistavat saumattoman AR-kokemuksen, mikä saa virtuaali- ja reaalimaailman tuntumaan aidosti integroituneilta. 🚀

  1. Miksi virtuaalinen pääni on väärässä linjassa todellisten kasvojen kanssa?
  2. Ongelma johtuu usein väärästä kameran kalibroinnista. Käyttämällä työkaluja, kuten OpenCV, laskea ja voi parantaa kohdistusta huomattavasti.
  3. Mikä on polttovälin rooli AR-kohdistuksessa?
  4. The määrittää, kuinka kamera heijastaa 3D-pisteet 2D-tasolle. Sen säätäminen Unityn fyysisen kameran asetuksissa voi parantaa tarkkuutta.
  5. Pystyykö Unity käsittelemään linssin vääristymän korjausta?
  6. Kyllä, Unity tukee varjostimia vääristymien korjaamiseen. Toteuta varjostin ominaisuuksilla, kuten mukauttaaksesi korjauksia linssiprofiilisi perusteella.
  7. Kuinka voin testata virtuaaliobjektien kohdistusta?
  8. Yksikkötestien käyttäminen NUnitissa komennoilla, kuten mahdollistaa virtuaaliobjektien sijainnin ja pyörimisen vahvistamisen eri olosuhteissa.
  9. Onko jälkikäsittely tarpeen AR-projekteissa?
  10. Vaikka se ei ole pakollista, jälkikäsittelytehosteet, kuten ja voi parantaa AR-kohtausten visuaalista laatua ja realistisuutta.
  11. Voiko MediaPipe havaita muita esineitä kuin kasvoja?
  12. Kyllä, MediaPipe tarjoaa ratkaisuja käsiin, poseerauksiin ja jopa kokonaisvaltaiseen seurantaan, mikä tekee siitä monipuolisen erilaisiin AR-käyttötapauksiin.
  13. Mikä laitteisto toimii parhaiten Unity AR -sovelluksissa?
  14. Suorituskykyisillä GPU:illa ja tarkoilla kameroilla varustetut laitteet ovat ihanteellisia. Työkalut kuten ja parantaa yhteensopivuutta entisestään.
  15. Miksi kohdistus on huonompi tietyissä kulmissa?
  16. Tämä voi johtua kameran ja virtuaaliympäristön kuvakentän epäsuhtaisuudesta. Unity-kameran säätö omaisuus voi auttaa.
  17. Kuinka varjostimet parantavat AR-kohdistusta?
  18. Varjostimet mahdollistavat renderöinnin reaaliaikaiset säädöt, kuten vääristymien korjaamisen tai linssiefektien simuloinnin, mikä varmistaa paremman synkronoinnin virtuaalisten ja todellisten kohteiden välillä.
  19. Voivatko AR-järjestelmät säädellä itseään ajan myötä?
  20. Kyllä, koneoppimismallien integroiminen mahdollistaa järjestelmien mukautumisen dynaamisesti ja palautteen perusteella parantaakseen kohdistusta ja suorituskykyä ajan myötä.

Tarkan kohdistuksen saavuttaminen virtuaalisten ja reaalimaailman kohteiden välillä on ratkaisevan tärkeää mukaansatempaavien AR-kokemusten kannalta. Huolellisen kalibroinnin ja kehittyneiden tekniikoiden avulla voidaan lieventää ongelmia, kuten objektiivin vääristymiä ja epäsopivia polttoväliä, mikä varmistaa paremman tarkkuuden ja käyttäjätyytyväisyyden.

Unityn työkalujen, MediaPipe-algoritmien ja dynaamisten säätöjen integrointi tarjoaa kestäviä ratkaisuja AR-kehittäjille. Nämä parannukset mahdollistavat saumattoman digitaalisen ja fyysisen maailman yhdistämisen, mikä avaa uusia mahdollisuuksia pelaamiseen, virtuaalisiin kokouksiin ja muuhun. Sinnikkyyden ja innovatiivisuuden ansiosta AR-linjaushaasteista tulee hallittavissa. 🚀

  1. Yksityiskohdat MediaPipen käytöstä Unityssa viitattiin virallisesta MediaPipe-dokumentaatiosta. Tutki sitä tässä .
  2. Ohjeita Unityn kameran kalibroinnista ja fyysisistä ominaisuuksista löytyy Unityn dokumentaatiosivustolta. Vierailla Unity-kameran asetukset saadaksesi lisätietoja.
  3. Shader-ohjelmointi AR-sovelluksiin ja objektiivin vääristymien korjaus sai inspiraationsa varjostimen kehitystä koskevista artikkeleista, kuten Kissamainen koodaus .
  4. ARCore-ominaisuudet ja Android-kehityksen rajoitukset tarkasteltiin Googlen ARCore-kehittäjäsivustolta. Lisätietoja osoitteessa Google ARCore .