ARCore istifadə edərək genişləndirilmiş şəkillər tətbiqi necə qurulur

Bu məqalə əvvəlcə burada dərc edilmişdir.

Bu dərsdə, lövbəri normal bir təyyarə əvəzinə müəyyən bir səhnə olaraq təyin edərək, 3D modellərin real aləmdə necə yerləşdiriləcəyini öyrənəcəksiniz. Google-un ARCore, ARCore tərəfindən tanınan 2 ölçülü şəkilləri genişləndirməyə və sonra üzərində 3D modellər yerləşdirməyə imkan verir.

Bəzi istinad şəkilləri təqdim edirsiniz və ARCore İzləmə həmin şəkillərin fiziki olaraq ərazidə yerləşməsini təyin edir. Artırılmış şəkillər onsuz da kitablarda, qəzetlərdə, jurnallarda və s. Geniş yayılmışdır.

Bununla birlikdə, bu təlimatı araşdırmadan əvvəl bu təlim üçün bir şərt olaraq aşağıdakı məqalələri oxuduğunuzdan əmin olun:

  • Google ARCore nədir?
  • ARCore ilə genişlənmiş reallıq tətbiqi yaratmaq.

Bu iki addımı tamamladıqdan sonra ARCore və Sceneform-da terminologiya haqqında əsas bir anlayışa sahib olacaqsınız: B. Səhnə, Çapa, Düyün, Transformable Düyün və s.

Genişləndirilmiş Şəkillər nədir?

Geliştirici sənədlərinə görə, istifadəçi mühitində posterlər və ya məhsul qablaşdırması kimi 2 ölçülü şəkillərə cavab verə biləcək AR tətbiqləri yaratmaq üçün ARCore'da Genişləndirilmiş Şəkillərdən istifadə edə bilərsiniz. Bir sıra istinad şəkilləri təqdim edirlər və ARCore izləmə, bu görüntülərin kamera görünüşündə tanınan kimi bir AR sessiyasında olduqlarını izah edir.

Əsasən, Genişləndirilmiş Şəkillərlə sadə 2D görüntüsünü tətbiqiniz tərəfindən tanınan və sonra üzərində 3B model yerləşdirmək üçün istifadə edilə bilən Genişləndirilmiş Təsvirə çevirə bilərsiniz.

Artırılmış şəkillərdən istifadə etmək istəyirsinizsə

Genişləndirilmiş Şəkillərdən istifadə etməzdən əvvəl nəzərə alınacaq bəzi məhdudiyyətlər:

  • Tətbiqinizdə eyni vaxtda 20-dən çox şəkil skan edilə bilməz (ARCore eyni anda yalnız 20-yə qədər görüntü izləyə bildiyindən).
  • Real həyatda fiziki tərəf müqabili 6 "x 6" dan çox və düz olmalıdır.
  • Hərəkət edən obyektləri izləmək istəmirsiniz. ARCore hərəkət edən şəkilləri izləyə bilmir, baxmayaraq ki, şəkil dayanan kimi izləməyə başlaya bilər.
  • ARCore, istinad görüntüsündə xüsusiyyət nöqtələrindən istifadə edir və xüsusiyyət nöqtəsi məlumatlarını 1000 görüntü üçün saxlaya bilər.

Yaxşı bir istinad şəkli seçmək

ARCore ilə tanınma qabiliyyətini yaxşılaşdırmaq üçün yaxşı bir istinad şəkli seçmək üçün bəzi tövsiyələr:

  • Genişləndirilmiş şəkillər PNG, JPEG və JPG formatlarını dəstəkləyir.
  • Algılama yüksək kontrast nöqtələrinə əsaslanır, beləliklə rəngli və ya qara-ağ istinad şəklindən istifadə edilməsindən asılı olmayaraq həm rəngli, həm də qara-ağ şəkillər aşkarlanır.
  • Təsvir ən azı 300 x 300 piksel olmalıdır.
  • Yüksək qətnamə şəkillərindən istifadə etmək performansı artırmır.
  • Nümunələr və polka nöqtələri kimi təkrarlanan xüsusiyyətləri olan şəkillərdən qaçınmaq lazımdır.
  • İstinad şəklinizin nə qədər yaxşı olduğunu qiymətləndirmək üçün arcoreimg alətindən istifadə edin. Ən az 75 bal tövsiyə olunur.

Arcoreimg alətindən istifadə etmək üçün:

  • Android üçün ARCore SDK-nı bu linkdən yükləyin:
  • Zip faylının zip məzmununu istənilən nöqtədən çıxarın.
  • Çıxarılan qovluğa keçin və alətlər -> arcoreimg -> windows (istifadə etdiyiniz hər hansı bir şey linux / macos)
  • Bu nöqtədə əmr istəməsini açın.
  • İndi bu əmri daxil edin:
arcoreimg.exe eval-img --input_image_path = dog.png

Dog.png şəklinizin tam yolu ilə əvəz edin.

Genişləndirilmiş Şəkillər Tətbiqi ilə işə başlamaq

Artıq ARCore və Sceneform ilə tanış oldunuz və 75+ reytinqi ilə yaxşı bir istinad şəkli seçdiniz, tətbiqi kodlamağa başlamağın vaxtı gəldi!

Xüsusi bir fraqment yaradın

Fəaliyyətimizə əlavə etmək üçün xüsusi bir parça yaradacağıq. Standart parçanın bəzi xüsusiyyətlərini dəyişdirəcəyimiz üçün xüsusi bir parçaya ehtiyacımız var.

CustomArFragment adlı bir sinif yaradın və ArFragment-dən genişləndirin. CustomArFragment kodu:

Paket com.ayusch.augmentedimages;
idxal android.util.Log;
com.google.ar.core.Config idxal; idxal com.google.ar.core.Session; com.google.ar.sceneform.ux.ArFragment idxal;
ümumi sinif CustomArFragment ArFragmenti genişləndirir {
@Override qorunan Config getSessionConfiguration (sessiya sessiyası) {getPlaneDiscoveryController (). setInstructionView (boş); Config config = new Config (sessiya); config.setUpdateMode (Config.UpdateMode.LATEST_CAMERA_IMAGE); session.configure (config); getArSceneView (). setupSession (sessiya);
qayıt konfiqurasiya; }
}

Əvvəlcə səviyyə aşkarlama ifadəsini sıfıra təyin edək. Bu şəkildə parçanın başlanğıcından dərhal sonra görünən əl işarəsini söndürürük və istifadəçiyə telefonunu hərəkət etdirməyi tapşırırıq. Artıq təsadüfi təyyarələri deyil, müəyyən bir görüntüyü tanıdığımız üçün buna ehtiyacımız yoxdur.

Sonra sessiya üçün güncəlləmə rejimini LATEST_CAMERA_IMAGE olaraq təyin etdik. Bu, hər dəfə kamera çərçivəsi yeniləndikdə yeniləmə dinləyicinizin çağırılmasını təmin edəcəkdir. Bu, yeniləmə metodunun davranışını konfiqurasiya etmək üçün istifadə olunur.

Genişləndirilmiş Şəkillər verilənlər bazasının qurulması

Seçdiyiniz istinad şəklinizi (fiziki dünyada tanımaq istədiyiniz) Aktivlər qovluğuna yapışdırın. Aktivlər qovluğunuz yoxdursa, birini yaradın. İndi verilənlər bazamıza daha sonra gerçək dünyada tanınacaq inkişaf etmiş şəkillər əlavə edəcəyik.

Bu verilənlər bazası fraqment (səhnə) yaradıldıqdan sonra qurulur. Sonra bu zəngin uğur və uğursuzluğunu yoxlayırıq və protokolu buna uyğun olaraq tənzimləyirik. Xüsusi fraqmentinizə aşağıdakı kodu əlavə edin:

if ((((MainActivity) getActivity ()). setupAugmentedImagesDb (config, session))) {Log.d ("SetupAugImgDb", "Uğur"); } başqa {Log.e ("SetupAugImgDb", "Faliure quraşdırma db"); }

CustomArFragment belə görünəcək:

Paket com.ayusch.augmentedimages;
idxal android.util.Log;
com.google.ar.core.Config idxal; idxal com.google.ar.core.Session; com.google.ar.sceneform.ux.ArFragment idxal;
ümumi sinif CustomArFragment ArFragmenti genişləndirir {
@Override qorunan Config getSessionConfiguration (sessiya sessiyası) {getPlaneDiscoveryController (). setInstructionView (boş); Config config = new Config (sessiya); config.setUpdateMode (Config.UpdateMode.LATEST_CAMERA_IMAGE); session.configure (config); getArSceneView (). setupSession (sessiya);
if ((((MainActivity) getActivity ()). setupAugmentedImagesDb (config, session))) {Log.d ("SetupAugImgDb", "Uğur"); } başqa {Log.e ("SetupAugImgDb", "Faliure quraşdırma db"); }
qayıt konfiqurasiya; }
}

Qısa müddətdə MainActivity-də setupAugmentedImagesDb metodunu yaradacağıq. CustomArFragment yaratdıqdan sonra onu activity_main.xml səhifəmizə əlavə edin. Faaliyet_main.xml kodunuz budur:


    

Bu fraqmentin adını CustomArFragment olaraq təyin etdiyimizə diqqət yetirin. Bu, əlavə olunan fraqmentin bizim xüsusi fraqmentimiz olmasını təmin etmək üçün lazımdır. Bu, avtorizasiya işinin və iclas başlanğıclarının həyata keçirilməsini təmin edir.

Genişlənmiş Şəkillər bazasına bir şəkil əlavə etmək

Burada şəkil məlumat bazasını qurduq. Gerçək dünyada istinad şəklini tapın və sonra uyğun bir 3D modeli əlavə edin.

Verilənlər bazasını qurmağa başlayaq. MainActivity.java sinfində bir setupAugmentedImagesDb ümumi funksiyası yaradın:

public boolean setupAugmentedImagesDb (Config config, Session session) {AugmentedImageDatabase augmentedImageDatabase; Bitmap bitmap = loadAugmentedImage (); if (bitmap == null) {səhv qayıt; }
augmentedImageDatabase = yeni AugmentedImageDatabase (sessiya); augmentedImageDatabase.addImage ("Tiger", Bitmap); config.setAugmentedImageDatabase (augmentedImageDatabase); doğru qayıt; }
xüsusi bitmap loadAugmentedImage () {
try (InputStream is = getAssets (). open ("blanket.jpeg")) {return BitmapFactory.decodeStream (is); } tutmaq (IOException e) {Log.e ("ImageLoad", "IO Exception", e); }
null qayıt; }

Görünüşü Aktivlər qovluğundan yükləyən və bitmap qaytaran loadAugmentedImage metoduna sahibik.

SetupAugmentedImagesDb-də əvvəlcə bu iclas üçün verilənlər bazasını işə salırıq və sonra bu verilənlər bazasına bir şəkil əlavə edirik. Rəsmimizə "Pələng" adını verəcəyik. Sonra bu sessiya konfiqurasiyası üçün verilənlər bazasını qurduq və görüntünün uğurla əlavə olunduğunu göstərmək üçün true qayıdırıq.

Gerçək dünyada istinad şəkillərinin tanınması

İndi real dünyada istinad şəkillərimizi çəkməyə başlayacağıq. Bunu etmək üçün səhnəmizə hər bir çərçivə yaradıldığı zaman çağırılan və istinad şəklini tapmaq üçün o kadr analiz edildiyi bir dinləyici əlavə edirik.

Bu sətri MainActivity.java onCreate metoduna əlavə edin:

arFragment.getArSceneView (). getScene (). addOnUpdateListener (bu :: onUpdateFrame);

İndi onApdateFrame metodunu MainActivity-ə əlavə edin:

@RequiresApi (api = Build.VERSION_CODES.N) xüsusi boşluq onUpdateFrame (FrameTime frameTime) {Çərçivə çərçivəsi = arFragment.getArSceneView (). GetArFrame ();
kolleksiya augmentedImages = frame.getUpdatedTrackables (AugmentedImage.class); for (AugmentedImage augmentedImage: augmentedImages) {if (augmentedImage.getTrackingState () == TrackingState.TRACKING) {if (augmentedImage.getName (). equals ("tiger") && shouldAddModel) augageArage getCenterPose ()), Uri.parse ("Mesh_BengalTiger.sfb")); shouldAddModel = yalan; }}}}

Birinci sətirdə kadrı səhnədən alırıq. Çerçeve videonun ortasında bir anlıq görüntü kimi görünə bilər. Videonun necə işlədiyini bilirsənsə, bilirsən ki, bu filmin təəssüratını verən çox sürətlə fırlanan bir sıra hərəkətsiz şəkillərdir. Bu görüntülərdən birini çıxarırıq.

Çərçivəyə sahib çıxan kimi istinad şəklimiz üçün təhlil edirik. ARCore-un frame.getUpdatedTrackables ilə izlədiyi bütün maddələrin siyahısını çıxarırıq. Bu, tanınmış bütün şəkillərin toplusudur. Sonra kolleksiyadan keçib "Tiger" şəklimizin çərçivədə olub olmadığını yoxlayırıq.

Bir uyğunluq tapdıqda, tanınmış görüntünün üstünə 3B model yerləşdiririk.

Qeyd: modeli yalnız bir dəfə əlavə etdiyimizə əmin olmaq üçün shouldAddModel əlavə etdim.

Referans görüntüsünün üzərinə 3B model qoyun

Artıq imicimizi real dünyada gördük, bunun üzərinə 3B modellər əlavə etməyə başlaya bilərik. Əvvəlki layihəmizdən placeObject və addNodeToScene metodlarını kopyalayırıq və buraya əlavə edirik.

Bu metodların nə etdiyini sətir-üstə izah etsəm də, baxış:

  • PlaceObject: Bu metod təqdim olunan Uri-dən göstərilə bilən bir şey yaradır. İşlənə bilən yaradıldıqdan sonra, göstərilən elementi bir qovşağa əlavə edən və bu qovşağı səhnəyə əlavə edən addNodeToScene metoduna keçir.
  • AddNodeToScene: Bu metod qəbul edilmiş lövbərdən bir AnchorNode yaradır, göstərilənin əlavə olunduğu başqa bir node yaradır, bu nodu AnchorNode-a əlavə edir və AnchorNode-u səhnəyə əlavə edir.

Budur son MainActivity.java sinifimiz:

Paket com.ayusch.augmentedimages;
idxal android.graphics.Bitmap; idxal android.graphics.BitmapFactory; İdxal android.net.Uri; idxal android.os.Build; idxal android.support.annotation.RequiresApi; idxal android.support.v7.app.AppCompatActivity; idxal android.os.Bundle; idxal android.util.Log; idxal android.widget.Toast;
idxal com.google.ar.core.Anchor; com.google.ar.core.AugmentedImage idxal; com.google.ar.core.AugmentedImageDatabase idxal; com.google.ar.core.Config idxal; com.google.ar.core.Frame idxal; idxal com.google.ar.core.Session; idxal com.google.ar.core.TrackingState; com.google.ar.sceneform.AnchorNode idxal etmək; com.google.ar.sceneform.FrameTime idxal; idxal com.google.ar.sceneform.rendering.ModelRenderable; idxal com.google.ar.sceneform.rendering.Renderable; com.google.ar.sceneform.ux.ArFragment idxal; com.google.ar.sceneform.ux.TransformableNode idxal etmək;
idxal java.io.IOException; idxal java.io.InputStream; idxal java.util.Collection;
ümumi sinif MainActivity AppCompatActivity {ArFragment arFragment; boolean shouldAddModel = true;
@Override qorunan boşluq onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); arFragment = (CustomArFragment) getSupportFragmentManager (). findFragmentById (R.id.sceneform_fragment); arFragment.getPlaneDiscoveryController (). gizlət (); arFragment.getArSceneView (). getScene (). addOnUpdateListener (bu :: onUpdateFrame); }
@RequiresApi (api = Build.VERSION_CODES.N) xüsusi boşluq placeObject (ArFragment arFragment, anchor anchor, Uri uri) {ModelRenderable.builder () .setSource (arFragment.getContext (), uri) .build () .thenAccept (model - > addNodeToScene (arFragment, anchor, modelRenderable)). müstəsna olaraq (atmaq -> {Toast.makeText (arFragment.getContext (), "Error:" + throwable.getMessage (), Toast.LENGTH_LONG) .show (); return null; }
); }
@RequiresApi (api = Build.VERSION_CODES.N) xüsusi boşluq onUpdateFrame (FrameTime frameTime) {Çərçivə çərçivəsi = arFragment.getArSceneView (). GetArFrame ();
kolleksiya augmentedImages = frame.getUpdatedTrackables (AugmentedImage.class); for (AugmentedImage augmentedImage: augmentedImages) {if (augmentedImage.getTrackingState () == TrackingState.TRACKING) {if (augmentedImage.getName (). Equals ("tiger") && shouldAddModel) augmentAgage getCenterPose ()), Uri.parse ("Mesh_BengalTiger.sfb")); shouldAddModel = yalan; }}}}
public boolean setupAugmentedImagesDb (Config config, Session session) {AugmentedImageDatabase augmentedImageDatabase; Bitmap bitmap = loadAugmentedImage (); if (bitmap == null) {səhv qayıt; }
augmentedImageDatabase = yeni AugmentedImageDatabase (sessiya); augmentedImageDatabase.addImage ("Tiger", Bitmap); config.setAugmentedImageDatabase (augmentedImageDatabase); doğru qayıt; }
xüsusi Bitmap loadAugmentedImage () {cəhd edin (InputStream is = getAssets (). open ("blanket.jpeg")) {return BitmapFactory.decodeStream (is); } tutmaq (IOException e) {Log.e ("ImageLoad", "IOException", e); }
null qayıt; }
private void addNodeToScene (ArFragment arFragment, Anchor anchor, Renderable renderable) {AnchorNode anchorNode = yeni AnchorNode (anchor); TransformableNode node = yeni TransformableNode (arFragment.getTransformationSystem ()); node.setRenderable (göstərilə bilən); node.setParent (anchorNode); arFragment.getArSceneView (). getScene (). addChild (anchorNode); node.select (); }
}

İndi tətbiqinizi işə salın. Aşağıda göstərildiyi kimi bir ekran görməlisiniz. İstinad obyektinin üstündə bir az hərəkət edin. ARCore xüsusiyyət nöqtələrini tanıyır və real dünyadakı istinad görüntüsünü tanıyan kimi 3D modelinizi əlavə edir.

[başlıq id = "attachment_1000" align = "aligncenter" width = "1280"]

Yorğanımı istinad kimi istifadə etdim

Artıq Google və Sceneform SDK-dan ARCore ilə ilk genişləndirilmiş şəkillər tətbiqatımızı yaratdıq!

Ən son məqalələrdən xəbərdar olmaq istəyirsinizsə, bu səhifənin sağ üst hissəsindəki elektron poçt ünvanınızı daxil edərək həftəlik bülletenə abunə olun.

Oxuduqlarınızı bəyənirsiniz? Bu yazını Facebook, WhatsApp və LinkedIn-də paylaşmağı unutmayın.

Məni LinkedIn, Quora, Twitter və Instagram-da izləyə bilərsiniz, burada Android və Flutter başda olmaqla mobil inkişaf ilə bağlı sualları cavablandırıram.