Mobilne Aplikacje Multimedialne Rozszerzona rzeczywistość (AR, Augmented Reality) w Systemie Android Cz.2 Krzysztof Bruniecki
Układy odniesienia Z B Już znamy Y B X B autor: Krzysztof Bruniecki 2
ECEF (ang. Earth-Centered, Earth- Fixed) autor: Krzysztof Bruniecki 3
Konwersja do ECEF a, b półoś wielka, mała f spłaszczenie szerokość geograficzna długość geograficzna h wysokość b a a f e 2 X Y Z ( a 2 ( v ( v b 2 ( v(1 e ) / 2 ) a 2 v h)cos sin h)cos cos h)sin (1 e 2 a sin 2 ) 1/ 2 autor: Krzysztof Bruniecki 4
ECEF->ENU (m-frame) ENU (ang. East, North, Up) = Mapping frame X ECEF, Y ECEF, Z ECEF współrzędne punktu X ECEF, Y ECEF, Z ECEF współrzędne lokalne (środka układu ENU E, N, U współrzędne punktu w układzie lokalnym ENU (m-frame) E N U sin cos sin cos cos cos sin sin sin cos 0 X cos Y sin Z ECEF ECEF ECEF X ' Y ' Z' ECEF ECEF ECEF autor: Krzysztof Bruniecki 5
Deklinacja magnetyczna Kąt pomiędzy południkiem magnetycznym oraz południkiem geograficznym Podawany w danym punkcie Ziemi Kąt płaski, podawany jak azymut Wpływa na nią położenie bieguna magnetycznego Ziemi lokalne uwarunkowania geologiczne (rudy żelaza, itp.) czas autor: Krzysztof Bruniecki 6
Main Field Declination The World Magnetic Model autor: Krzysztof Bruniecki 7
GeomagneticField (1) Klasa: class GeomagneticField extends Object Pakiet: android.hardware.geomagneticfield Estymuje pole magnetyczne w podanym punkcie na Ziemi Pozwala na oszacowanie deklinacji magnetycznej od prawdziwej północy Jako model wykorzystuje World Magnetic Model (United States National Geospatial-Intelligence Agency) http://www.ngdc.noaa.gov/geomag/wmm/dodwmm.shtml. Używa modelu z 2010 roku (WMM-2010) Wg standardu ważny do 2015, ale będzie dawał racjonalne wyniki jeszcze wiele lat później W nowszych wersjach Androida może być wprowadzony nowszy model autor: Krzysztof Bruniecki 8
GeomagneticField (2) Konstruktor: GeomagneticField(float gdlatitudedeg, float gdlongitudedeg, float altitudemeters, long timemillis) Obiekt służący do estymacji pola magnetycznego Ziemi w zadanym miejscu i czasie gdlatitudedeg Szerokość WGS84 w stopniach dodatnia na zachód gdlongitudedeg długość WGS84 w stopniach dodatnia na północ altitudemeters Wysokość elipsoidalna WGS84, w metrach timemillis milisekundy od 1 stycznia 1970 (można podać wartość przybliżoną autor: Krzysztof Bruniecki 9
GeomagneticField (3) Metody public float getdeclination () Zwraca deklinację magnetyczną public float getinclination () Zwraca inklinację magnetyczną (wartość dodatnia oznacza że pole jest skierowane w dół względem płaszczyzny Ziemi) autor: Krzysztof Bruniecki 10
GeomagneticField (4) public float getfieldstrength () Siła pola w nanoteslach public float gethorizontalstrength () Pozioma składowa pola magnetycznego w nanoteslach public float getx () Składowa skierowana na północ (geograficzną) w nanoteslach public float gety () Składowa skierowana na wschód (geograficzny) w nanoteslach public float getz () Składowa skierowana w dół w nanoteslach autor: Krzysztof Bruniecki 11
Jak wykorzystać informacje z modelu magnetycznego? Obrót elementarny autor: Krzysztof Bruniecki 12
Kąt pomiędzy wektorami autor: Krzysztof Bruniecki 13
Omówienie zadań laboratoryjnych (1) Zaimplementować mechanizm wyszukiwania Warszawy (z tolerancją +-10 stopni). Pozycję bieżącą oraz pozycję Warszawy można umieścić bezpośrednio w kodzie. Można rozważać sytuację dwuwymiarową. autor: Krzysztof Bruniecki 14
Omówienie zadań laboratoryjnych (2) Utworzyć interfejs użytkownika umożliwiający dodawanie nowych lokalizacji (a dokładnie wektora wskazującego lokalizację) poprzez wskazanie urządzeniem i dodanie opisu. Następnie umożliwić przeszukiwanie tej bazy poprzez zmianę orientacji urządzenia. Podpowiedź: jako kryterium bliskości wektorów posłużyć się kątem pomiędzy nimi. autor: Krzysztof Bruniecki 15
Przykład Załóżmy następujące położenie (nasze): 18E 55N 0m(wysokość) Punkty wykrywane: 18.0001E 55.0001N 1000m Gdzieś nad horyzontem 17E 55N 0m Zachód 18E 55N 1000m Góra 19E 56N 0m Północny wschód 0E 90N 100000000000m Gwiazda polarna WGS84 a = 6.378.137,0 m b = 6.378.137,0 m Uwaga na radiany/stopnie autor: Krzysztof Bruniecki 16
Model kamery otworkowej Jak należałoby zamontować kamerę w smartfonie żeby układ kamery zgadzał się z układem b-frame? autor: Krzysztof Bruniecki 17
Układ kamery (back-facing) Z B Y B X B Y C Z C X C autor: Krzysztof Bruniecki 18
Model kamery otworkowej (2) Przekrój w płaszczyźnie YZ autor: Krzysztof Bruniecki 19
Układ kamery a układ obrazu Jak przeliczyć wektor wyrażony w b-frame do współrzędnych w pikselach? Jak przeliczyć współrzędne w układzie obrazu na współrzędne bitmapy? autor: Krzysztof Bruniecki 20
Przykład Jakie jest położenie obrazu (w płaszczyźnie obrazowania) punktu o współrzędnych (względem kamery) [50m, -30m, 50m] dla kamery o ogniskowej f=1cm? Jakie jest położenie obrazu punktu o współrzędnych [-20m, -20m, -40m]? autor: Krzysztof Bruniecki 21
Współrzędne jednorodne Sposób reprezentacji punktów w n wymiarowych przestrzeniach za pomocą n+1 współrzędnych dla n=2, punkt (x,y) w przestrzeni kartezjańskiej jest reprezentowany przez (x,y,1)=(wx,wy,w) dla w!=0 punkty (x,y,0) reprezentują punkty w nieskończoności Zaletą współrzędnych jednorodnych jest możliwość zwięzłego opisu przekształceń, takich jak translacja, obrót, skalowanie, rzut perspektywiczny przy użyciu macierzy autor: Krzysztof Bruniecki 22
Macierz kalibracji kamery x K 0 s 0 x0 y 1 0 y 0 x =fk x, y =fk y są długościami ogniskowej wyrażonymi w liczbie pikseli poziomych i pionowych, k x, k y liczby pikseli na milimetr w poszczególnych osiach kamery, x 0,y 0 współrzędne punktu głównego w układzie obrazu, s współczynnik skośności osi x i y, Założyć że w Samsungu Galaxy S (dostępnym na zajęciach laboratoryjnych). Jak określić macierz kalibracji? Obszar widoczności kamery szerokość/wysokość [stopnie] 51,2x39,4 autor: Krzysztof Bruniecki 23
Macierz rzutu perspektywicznego K macierz kalibracji R macierz rotacji kamery t macierz translacji kamery Jeżeli wektor q wyrażony jest w układzie kamery wówczas macierz rzutu perspektywicznego przyjmuje uproszczoną postać autor: Krzysztof Bruniecki 24
Camera API android.hardware.camera <uses-permission android:name="android.permission.camera" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> Rysowanie na podglądzie z kamery W Android Manifest ustawić layout aktywności jako horizontal autor: Krzysztof Bruniecki 25
Włączanie podglądu i wykonywanie zdjęć 1. Pobrać instancję kamery z użyciem open(int). 2. Odczytać parametry getparameters() jako instancję klasy Camera.Parameters 3. Zmodyfikować parametry (jeśli to konieczne) poprzez setparameters(camera.parameters) 4. Jeśli konieczne to ustalić orientację ekranu względem podglądu z kamery setdisplayorientation(int). 5. Przekazać zainicjalizowany obiekt SurfaceHolder do metody setpreviewdisplay(surfaceholder). 6. Wywołać startpreview() aby rozpocząć podgląd z kamery na ekranie (musi być włączony podgląd żeby rozbić zdjęcia) 7. Wywołać takepicture(camera.shuttercallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback) żeby zrobić zdjęcie. Obsłużyć Callbacki. 8. Po wykonaniu zdjęcia podgląd będzie zatrzymany. Aby wykonać kolejne wywołać startpreview() 9. Wywołać stoppreview() żeby zatrzymać podgląd 10. Wywołać release() dla innych aplikacji. Należy zrobić to niezwłocznie w onpause() (otworzyć ponownie używając open() w onresume()) autor: Krzysztof Bruniecki 26
SurfaceView class Preview extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder mholder; private Camera camera; Preview(Context context) { super(context); mholder = getholder(); mholder.addcallback(this); } //musi być mimo że jest w dokumentacji jest deprecated mholder.settype(surfaceholder.surface_type_push_buffers); autor: Krzysztof Bruniecki 27
SurfaceHolder.Callback public void surfacecreated(surfaceholder holder) { } camera = Camera.open(); try { } catch (IOException e) { } camera.setpreviewdisplay(holder); e.printstacktrace(); public void surfacedestroyed(surfaceholder holder) { } camera.stoppreview(); camera.release(); camera = null; public void surfacechanged(surfaceholder holder, int format, int w, int h) { } Camera.Parameters parameters = camera.getparameters(); parameters.setpreviewsize(w, h); camera.setparameters(parameters); camera.startpreview(); autor: Krzysztof Bruniecki 28
Rysowanie na SurfaceView Nałożenie nowej warstwy na SurfaceView SurfaceView domyslnie rysowany jest za oknem Przygotowanie interfejsu użytkownika w XML: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:id="@+id/relativelayout1" android:layout_width="match_parent" android:keepscreenon="true"></relativelayout> autor: Krzysztof Bruniecki 29
public class MojeView extends View public class MojeView extends View{ @Override protected void ondraw(canvas canvas) { super.ondraw(canvas); Paint p = new Paint(); p.setargb(255, 255, 0, 0); canvas.drawtext("mojeview.ondraw: i="+i++, 200, 100, p); canvas.drawtext("mojeview.ondraw: j="+j++, 200, 150, p); if(dane!=null) { canvas.drawline(0, 0, 100*dane[0], 100*dane[0], p); p.setstyle(style.stroke); canvas.drawrect(100, 100, 200, 200, p); } } } autor: Krzysztof Bruniecki 30
Dodanie kontrolek do okna Dodanie SurfaceView i kontrolki do okna setcontentview(r.layout.main); rl = (RelativeLayout)findViewById(R.id.relativeLayout1); mycameraview = new Preview(this); rl.addview(mycameraview); mycameraoverlay = new MojeView(this); rl.addview(mycameraoverlay); Odrysowanie kontrolki mycameraview.invalidate(); autor: Krzysztof Bruniecki 31
Nowsze API... Klasa Camera public final void setdisplayorientation (int degrees) public static int getnumberofcameras () public final void setfacedetectionlistener (Camera.FaceDetectionListener listener) public final void startfacedetection () autor: Krzysztof Bruniecki 32