obraz floating world
Transkrypt
obraz floating world
Mobilne Aplikacje Multimedialne Rozszerzona rzeczywistość (AR, Augmented Reality) w Systemie Android Cz.2 Krzysztof Bruniecki Układy odniesienia Już znamy ZB YB XB autor: Krzysztof Bruniecki 2 ECEF (ang. Earth-Centered, EarthFixed) 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 a e (a b ) / a v (1 e 2 sin 2 )1 / 2 X (v h) cos cos 2 2 2 2 Y (v h) cos sin Z (v(1 e ) h) sin 2 autor: Krzysztof Bruniecki 4 ECEF->ENU (m-frame) • ENU (ang. East, North, Up) = Mapping frame • XECEF, YECEF, ZECEF – 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 sin N cos sin U cos cos cos sin sin sin cos 0 X ECEF X ' ECEF cos YECEF Y ' ECEF sin Z ECEF Z ' 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 Obrót elementarny Jak wykorzystać informacje z modelu magnetycznego? 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) ZB YB XB YC ZC autor: Krzysztof Bruniecki XC 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 s K 0 y 0 0 x0 y0 1 x=fkx, y=fky – są długościami ogniskowej wyrażonymi w liczbie pikseli poziomych i pionowych, kx, ky – liczby pikseli na milimetr w poszczególnych osiach kamery, x0,y0 – 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 51,2x39,4 szerokość/wysokość [stopnie] 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. 2. 3. 4. 5. 6. 7. 8. 9. 10. Pobrać instancję kamery z użyciem open(int). Odczytać parametry getParameters() jako instancję klasy Camera.Parameters Zmodyfikować parametry (jeśli to konieczne) poprzez setParameters(Camera.Parameters) Jeśli konieczne to ustalić orientację ekranu względem podglądu z kamery setDisplayOrientation(int). Przekazać zainicjalizowany obiekt SurfaceHolder do metody setPreviewDisplay(SurfaceHolder). Wywołać startPreview() aby rozpocząć podgląd z kamery na ekranie (musi być włączony podgląd żeby rozbić zdjęcia) Wywołać takePicture(Camera.ShutterCallback, Camera.PictureCallback, Camera.PictureCallback, Camera.PictureCallback) żeby zrobić zdjęcie. Obsłużyć Callbacki. Po wykonaniu zdjęcia podgląd będzie zatrzymany. Aby wykonać kolejne wywołać startPreview() Wywołać stopPreview() żeby zatrzymać podgląd 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 { camera.setPreviewDisplay(holder); } catch (IOException e) { 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